首页 > 解决方案 > 让 3D 对象查看 3D 对象矩阵?

问题描述

我目前所拥有的导致我的 3D 对象变得平坦。但它正在看我的目标。

    Vector4 up;
    newMatrix.SetIdentity();

    up.set_x(0);
    up.set_y(1);
    up.set_z(0);

    Vector4 zaxis = player_->transform().GetTranslation() - spider_->transform().GetTranslation();
    zaxis.Normalise();
    Vector4 xaxis = CrossProduct(up, zaxis);
    xaxis.Normalise();
    Vector4 yaxis = CrossProduct(zaxis, xaxis);

    newMatrix.set_m(0, 0, xaxis.x()); newMatrix.set_m(0, 1, xaxis.y()); newMatrix.set_m(0, 2, xaxis.z());
    newMatrix.set_m(1, 0, yaxis.x()); newMatrix.set_m(1, 1, yaxis.y()); newMatrix.set_m(1, 2, yaxis.z());
    newMatrix.set_m(2, 0, zaxis.x()); newMatrix.set_m(2, 1, zaxis.y()); newMatrix.set_m(2, 2, zaxis.z());

请原谅将值放入矩阵的方法,我正在使用我的框架给我的东西。

Vector4 Game::CrossProduct(Vector4 v1, Vector4 v2)
{
    Vector4 crossProduct;
    crossProduct.set_x((v1.y() * v2.z()) - (v2.y() * v2.z()));
    crossProduct.set_y((v1.z() * v2.x()) - (v1.z() * v2.x()));
    crossProduct.set_z((v1.x() * v2.y()) - (v1.x() * v2.y()));
    return crossProduct;

}

我在这里做错了什么?请注意,为了以防万一,我在之前添加了第四行,并且在角落中添加了 1,没有任何更改。

标签: c++mathvisual-studio-2017

解决方案


(0,1,0)当与您要查看的方向接近平行时,您会遇到问题。叉积将导致一个或两个基向量为零,这可能导致二维外观。但只有当您的对象仅在y彼此之间的轴上偏移时才会发生这种情况。为避免这种情况,您可以在and方向dot之间测试产品,如果结果大于使用而不是使用(作为向上或向右或其他...)。upviewabs0.7(1,0,0)

此外,由于我们对您的符号一无所知,我们无法确认您的矩阵设置是否正确(可能是也可能不是,它可能被转置等)有关更多信息,请查看:

但很可能您的矩阵也包含透视变换,并且通过设置它的单元格,您将完全覆盖它,导致没有透视图,因此是 2D 输出。在这种情况下,您应该将原始透视矩阵与新矩阵相乘并使用结果。


推荐阅读