如何使搅拌机在左手操作

时间:2013-06-07 14:02:06

标签: model 3d directx export blender

所以我对搅拌机有一个小问题。

坐标计划似乎搞砸了(y是向前,z是向上)。我做了一些研究,显然这是一个“右手”系统,你可以通过使z向上和向前移动来改变输出,但我的问题是,x仍然是逆转的,我需要翻转它(x = x * 1.0)。另外,UV贴图很奇怪,我需要翻转V坐标(v = 1.0 - v)。有没有办法让搅拌机在“左手”系统中运行。这有点痛苦,因为我正在导出要在D3D中使用的对象。

3 个答案:

答案 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左手系统。