Model 如何让搅拌机在左手操作

Model 如何让搅拌机在左手操作,model,3d,directx,export,blender,Model,3d,Directx,Export,Blender,所以我的搅拌机有个小问题 坐标平面图似乎有点混乱(y是向前的,z是向上的)。我做了一些研究,很明显这是一个“右手”系统,你可以在导出时通过z向上和y向上改变它,但我的问题是,x仍然是反向的,我需要翻转它(x=x*1.0)。另外,UV贴图很奇怪,我需要翻转V坐标(V=1.0-V)。有没有办法让搅拌机在“左手”系统中运行。这有点痛苦,因为我正在导出要在D3D中使用的对象。您是对的,DirectX使用左手坐标系 这包括对从右手系统导入数据所需操作的描述(由于您的问题,我假设Blender是右手的)。这

所以我的搅拌机有个小问题


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

您是对的,DirectX使用左手坐标系

这包括对从右手系统导入数据所需操作的描述(由于您的问题,我假设Blender是右手的)。这些是要点

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

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

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


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

您可以通过翻转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;
}
vec quat2uler()
{
浮动W=此->W;
浮动X=此->X;
浮动Z=-此->Z;
浮动Y=此->Y;
浮点数WSquared=W*W;
浮点数X平方=X*X;
浮动Y平方=Y*Y;
浮点数ZSquared=Z*Z;
浮动偏航=(-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(偏航>=1.0f?1.00f:yaw也许你早就解决了你的问题,但我的回答可能会帮助其他人。我遇到了同样的问题。症状是(除了你的)渲染的测试立方体的UV坐标错误。原因是,Blender在右手坐标系中导出数据。导出波前时更改Blender设置不会有帮助。解决方案是反转Z、法线-Z和纹理-V,并通过更改索引数组或顶点数组中的顶点顺序来恢复顶点绘制顺序,具体取决于您

//反转v项的每个Z坐标:
z=-1.0f*input.z;
//反转vn入口的每个Z坐标:
nz=-1.0f*input.nz;
//反转vt入口的每个V坐标:
tv=1.0f-input.tv;
...
//组装顶点时:
//根据您的实现,将面顺序从0->1->2还原为2->1->0。

我需要的是,作为旁注,要反转面顺序,您只需交换每个三元组的最后两个顶点。应该为将来看到这一点的任何人指出,blender的导出器会反转纹理坐标的V坐标。我能够通过在运行时动态生成网格,从我是一个tileset矩形,在渲染时有一个反转的纹理。我之前翻转了我的纹理,使它们与obj格式一起工作。结果表明,纹理本身并没有像许多人错误地声明的那样被颠倒加载。obj格式本身,无论什么原因,都是反转的。在加载程序中使用1-v来抵消这一点。