【问题标题】:How do I make blender operate in Left Hand如何让搅拌机用左手操作
【发布时间】:2013-06-03 20:58:15
【问题描述】:

所以我的搅拌机有点小问题。

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

【问题讨论】:

    标签: model 3d directx export blender


    【解决方案1】:

    DirectX 使用左手坐标系是正确的。

    article on MSDN 包含对从右手系统导入数据所需执行的操作的描述(由于您的问题,我假设 Blender 是右手系统)。这些是重点

    Direct3D 使用左手坐标系。如果要移植基于右手坐标系的应用程序,则必须对传递给 Direct3D 的数据进行两次更改。

    • 翻转三角形顶点的顺序,使系统从前面顺时针遍历它们。换句话说,如果顶点是 v0、v1、v2,则将它们作为 v0、v2、v1 传递给 Direct3D。

    • 使用视图矩阵在 z 方向将世界空间缩放 -1。为此,请翻转用于视图矩阵的 D3DMATRIX 结构的 _31、_32、_33 和 _34 成员的符号。

    让 Blender 保持原样并在导入 D3D 时进行上述更改可能会更容易。

    【讨论】:

      【解决方案2】:

      也许您很久以前就已经解决了您的问题,但我的回答可能对其他人有所帮助。我遇到了同样的问题。症状是(除了你的)错误的测试立方体渲染的 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.
      

      【讨论】:

      • 这正是我所需要的,作为旁注,要反转面顺序,您只需交换每个三元组的最后两个顶点
      • 应该注意的是,对于将来看到这一点的任何人,blender 的导出器会反转纹理坐标的 V 坐标。我能够通过在运行时动态生成网格来证明这一点,从一个tileset矩形中采样,该矩形在渲染时具有一个倒置的纹理。我之前翻转了我的纹理以使它们与 obj 格式一起使用。事实证明,纹理本身并没有像许多人错误地指出的那样颠倒加载。 obj 格式本身,无论出于何种原因,都被反转了。在你的加载器中使用 1-v 来解决这个问题。
      【解决方案3】:

      您可以通过翻转 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 左手系统。

      【讨论】:

        猜你喜欢
        • 2013-06-15
        • 2020-01-06
        • 2017-09-24
        • 2016-01-19
        • 2012-11-15
        • 2012-02-07
        • 2018-07-13
        • 2011-08-11
        • 1970-01-01
        相关资源
        最近更新 更多