我当前正在使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,以防万一,没有变化。
答案 0 :(得分:0)
当(0,1,0)
接近要查看的方向时,您遇到了问题。比叉积将导致一个或两个基矢量为零,这可能导致2D外观失败。但这仅在您的对象之间仅在y
轴之间偏移时才会发生。为避免这种情况,您可以在dot
和up
方向之间测试view
乘积,如果结果的abs
大于0.7
,请使用(1,0,0)
而是(作为向上或向右或其他任何形式)。
由于我们对您的符号一无所知,因此无法确认矩阵的设置正确(可能正确或可能错误,可能会转置等),有关更多信息,请查看:
但是很可能您的矩阵也包含透视变换,并且通过设置其像元,您将其完全覆盖而导致没有透视,因此没有2D输出。在这种情况下,应将原始透视图矩阵与新矩阵相乘,然后使用结果。