forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Угол поворота модели(математика) (http://forum.boolean.name/showthread.php?t=655)

<Платон> 10.02.2006 18:19

Как найти угол поворота какого-нибудь меша, например куба в блице зная только координаты его вершин?
Если находить через аркосинус от скалярного произведения вектора нормали с векторами осей координат:), то получаются не такие углы как в блице. Как их преобразовать, так чтобы они совпадали? Или есть какой-то другой (математический) способ?

Платон 10.02.2006 18:55

Вот пример, углы не совпадают
Код:

Type TVector
 * * Field x#,y#,z#
End Type

Function DotProduct#(a.TVector,b.TVector)
 * *Return a\x*b\x+a\y*b\y+a\z*b\z
End Function

Function Length#(v.TVector)
 * *Return Sqr(DotProduct(v,v))
End Function

Function Scale(v.TVector,s#)
 * v\x=v\x*s
 *v\y=v\y*s
 *v\z=v\z*s
End Function

Function Normalize(v.TVector)
 * Scale(v,1.0/Length(v))
End Function

Function Normal.TVector(mesh,index)
        Local vec.TVector=New TVector
        Local vx#[2],vy#[2],vz#[2],A#[2],B#[2]
        Local surf=GetSurface(mesh,1)
        For i=0 To 2
 *TFormPoint VertexX(surf,TriangleVertex(surf,index,i)),VertexY(surf,TriangleVertex(surf,index,i)),VertexZ(surf,TriangleVertex(surf,index,i)),mesh,0
 *vx[i]=TFormedX()
 *vy[i]=TFormedY()
 *vz[i]=TFormedZ()
        Next
        A[0]=vx[0]-vx[1]
        A[1]=vy[0]-vy[1]
        A[2]=vz[0]-vz[1]
        B[0]=vx[2]-vx[1]
        B[1]=vy[2]-vy[1]
        B[2]=vz[2]-vz[1]
        vec\x=B[1]*A[2]-B[2]*A[1]
        vec\y=B[2]*A[0]-B[0]*A[2]
        vec\z=B[0]*A[1]-B[1]*A[0]
        Normalize(vec)
        Return vec
End Function

Function GetYaw#(mesh)
        Local VecN.TVector=Normal(mesh,0)
        WorldN\x=1.0
        WorldN\y=0.0
        WorldN\z=0.0
        Return ACos(DotProduct(VecN,WorldN))
End Function

Function GetPitch#(mesh)
        Local VecN.TVector=Normal(mesh,0)
        WorldN\x=0.0
        WorldN\y=0.0
        WorldN\z=1.0
        Return ACos(DotProduct(VecN,WorldN))
End Function

Global WorldN.TVector=New TVector

Graphics3D 640,480,16,2
SetBuffer BackBuffer()

camera=CreateCamera()

mesh=CreateCube()
PositionEntity mesh,0,0,5

While Not KeyDown(1)
        If KeyDown(203) Then TurnEntity mesh,0,-0.1,0
        If KeyDown(205) Then TurnEntity mesh,0,0.1,0
        If KeyDown(200) Then TurnEntity mesh,0.1,0,0
        If KeyDown(208) Then TurnEntity mesh,-0.1,0,0
        If KeyDown(30) Then TurnEntity mesh,0,0,0.1
        If KeyDown(44) Then TurnEntity mesh,0,0,-0.1
RenderWorld
Text 10,10,"origin Pitch "+Int(EntityPitch(mesh))+" normal Pitch "+ Int(GetPitch(mesh))
Text 10,25,"origin Yaw "+Int(EntityYaw(mesh))+" normal Yaw "+ Int(GetYaw(mesh))
Flip
Wend
End

Еще проблема в том что треугольник у модели может быть ориентирован под другим углом чем сама модель, и таким способом находитль углы модели нельзя.


Часовой пояс GMT +4, время: 11:45.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot