3D对象会看着3D对象矩阵吗?

时间:2018-11-25 12:10:04

标签: c++ math visual-studio-2017

我当前正在使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,以防万一,没有变化。

1 个答案:

答案 0 :(得分:0)

(0,1,0)接近要查看的方向时,您遇到了问题。比叉积将导致一个或两个基矢量为零,这可能导致2D外观失败。但这仅在您的对象之间仅在y轴之间偏移时才会发生。为避免这种情况,您可以在dotup方向之间测试view乘积,如果结果的abs大于0.7,请使用(1,0,0)而是(作为向上或向右或其他任何形式)。

由于我们对您的符号一无所知,因此无法确认矩阵的设置正确(可能正确或可能错误,可能会转置等),有关更多信息,请查看:

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