我有 3 个向量,Up Right 和 Front 代表一个方向。
我需要将它们转换为 XYZ 角度(3 个浮点数),以便可以与 glRotatef() 一起使用
请帮忙
[编辑]
它没有正确渲染。你能看看它是否有什么明显的地方:pastebin.com/f6683492d
我假设您的意思是“向上,向右和向前”,因为向下与向上相反,并且不会提供任何新信息。
你的问题不是很清楚,但我认为你的意思是你想创建一个转换到由你描述的向量定义的新坐标基础。如果这些向量是正交的(它们之间有 90 度),那么您就不需要费心计算角度和使用 glRotate()。相反,您可以直接使用新基的向量作为转换。
假设您拥有的向量是 A(a1,a2,a3) - 向上,B(b1,b2,b3) - 向右和 C(c1,c2,c3) - 向前。首先,如果它们不是完全正交的,您需要确保它们成为正交的,可能有一些交叉产品。其次,您需要确保它们的长度为 1。现在创建以下矩阵:
a1 b1 c1 0
a2 b2 c2 0
a3 b3 c3 0
0 0 0 1
这是一个旋转矩阵,它将把你从单位基数带到由 A、B、C 定义的基数。有了这个矩阵,你需要做的就是使用 glMultMatrix(),你就完成了。如果第一次尝试不起作用,转置矩阵可能会解决它。
编辑再次检查后,矩阵的正确顺序应该是这样的:对于向量 A(ax,ay,az), B(bx,by,bz), C(cx,cy,cz)
ax ay az 0
bx by bz 0
cx cy cz 0
0 0 0 1
这是上述答案的转置。另外,我建议您首先尝试查看它是否可以在没有翻译的情况下使用。然后您可以通过简单地将其添加到矩阵中来添加翻译,如下所示:
ax ay az 0
bx by bz 0
cx cy cz 0
pos.x pos.y pos.z 1
x = acos( dp3( nrm( up ), new vec3( 0, 1, 0 ) ) );
y = acos( dp3( nrm( dir ), new vec3( 0, 0, 1 ) ) );
z = acos( dp3( nrm( right ), new vec3( 1, 0, 0 ) ) );
其中 dp3 是一个 3 分量点积,nrm 归一化一个 3 分量向量,而 vec3 按照定义构造一个。
这将为您提供您拥有的向量和默认坐标基础之间的角度。
编辑:当然,如上所述,您很可能已经有一个可以应用的基矩阵。也很容易进行正交归一化。实际上,我想不出你需要做我上面所做的事情的时间......但是..嘿......这是你要求的;)