Вот пример, углы не совпадают
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
Еще проблема в том что треугольник у модели может быть ориентирован под другим углом чем сама модель, и таким способом находитль углы модели нельзя.