所以我对搅拌机有一个小问题。
坐标计划似乎搞砸了(y 向前,z 向上)。我做了一些研究,显然这是一个“右手”系统,您可以通过使 z 向上和 y 向前来更改它,但我的问题是,x 仍然是反转的,我需要翻转它(x = x * 1.0)。另外,UV贴图很奇怪,我需要翻转V坐标(v = 1.0 - v)。有什么方法可以让搅拌机在“左手”系统中运行。这有点痛苦,因为我正在导出要在 D3D 中使用的对象。
DirectX 使用左手坐标系是正确的。
MSDN 上的这篇文章描述了从右手系统导入数据所需的操作(由于您的问题,我假设 Blender 是右手系统)。这些是要点
Direct3D 使用左手坐标系。如果要移植基于右手坐标系的应用程序,则必须对传递给 Direct3D 的数据进行两项更改。
翻转三角形顶点的顺序,使系统从前面顺时针遍历它们。换句话说,如果顶点是 v0、v1、v2,则将它们作为 v0、v2、v1 传递给 Direct3D。
使用视图矩阵在 z 方向将世界空间缩放 -1。为此,翻转用于视图矩阵的 D3DMATRIX 结构的 _31、_32、_33 和 _34 成员的符号。
将 Blender 保持原样并在导入到 D3D 时进行上述更改可能会更容易。
也许您很久以前就已经解决了您的问题,但我的回答可能对其他人有所帮助。我遇到了同样的问题。症状是(除了你的)错误的测试立方体渲染的 UV 坐标。原因是,Blender 在右手坐标系中导出数据。导出 Wavefront 时更改 Blender 设置无济于事。解决方案是反转 Z、Normal-Z 和 Texture-V,并通过更改顶点数组中的索引数组或顶点顺序来反转顶点绘制顺序,这取决于您。
// Invert every Z coord of v entry:
z = -1.0f * input.z;
// Invert every Z coord of vn entry:
nz = -1.0f * input.nz;
// Invert every V coord of vt entry:
tv = 1.0f - input.tv;
...
// When assembling vertices:
// Revert face order from 0->1->2 to 2->1->0, depending on your implementation.
您可以通过翻转 x 和 z 在它之间切换,并且在 quats 和 euler 之间转换时使用以下命令:
vec quat2euler()
{
float W = this->w;
float X = this->x;
float Z = -this->z;
float Y = this->y;
float WSquared = W * W;
float XSquared = X * X;
float YSquared = Y * Y;
float ZSquared = Z * Z;
float yaw = (-2.0f * ((X * Z) - (Y * W)));
vec TEuler(0);
TEuler.x = (atan2f(2.0f * (Y * Z + X * W), -XSquared - YSquared + ZSquared + WSquared));
TEuler.y = (asin(yaw >= 1.0f ? 1.00f : yaw <= -1.0f ? -1.00f : yaw));
TEuler.z = (atan2f(2.0f * (X * Y + Z * W), XSquared - YSquared - ZSquared + WSquared));
TEuler.mul(180.0f / PI);//90,180,270
return TEuler;
}
有一个小错误,它可以超出 -1 到 1 的范围,这个函数也测试这个。
fromula 最初来自: http ://www.irrlicht3d.org/wiki/index.php?n=Main.GettingStartedWithBullet
至少这是我解决它的方式,它是一个 zup 左手系统。