所以我对搅拌机有一个小问题。
坐标计划似乎搞砸了(y是向前,z是向上)。我做了一些研究,显然这是一个“右手”系统,你可以通过使z向上和向前移动来改变输出,但我的问题是,x仍然是逆转的,我需要翻转它(x = x * 1.0)。另外,UV贴图很奇怪,我需要翻转V坐标(v = 1.0 - v)。有没有办法让搅拌机在“左手”系统中运行。这有点痛苦,因为我正在导出要在D3D中使用的对象。
答案 0 :(得分:1)
您确定DirectX使用左手坐标系。
这个article on MSDN包含了从右手系统导入数据所需要做的描述(我假设Blender因为你的问题而是右撇子)。这些是要点
Direct3D使用左手坐标系。如果要移植基于右手坐标系的应用程序,则必须对传递给Direct3D的数据进行两处更改。
翻转三角形顶点的顺序,以便系统从前面顺时针穿过它们。换句话说,如果顶点是v0,v1,v2,则将它们作为v0,v2,v1传递给Direct3D。
使用视图矩阵在z方向上将世界空间缩放-1。为此,请翻转用于视图矩阵的D3DMATRIX结构的_31,_32,_33和_34成员的符号。
可能会更容易离开Blender,并在导入到D3D时进行上述更改。
答案 1 :(得分:1)
也许你很久以前就已经解决了你的问题,但我的回答可能对其他人有所帮助。我遇到了同样的问题。症状是(除了你的)测试立方体呈现的错误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.
答案 2 :(得分:0)
你可以通过滑动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的范围,此功能测试也是如此。
来自以下地区: http://www.irrlicht3d.org/wiki/index.php?n=Main.GettingStartedWithBullet
至少这是我如何解决它,它是一个zup左手系统。