c++ - 让 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,没有任何更改。
解决方案
(0,1,0)
当与您要查看的方向接近平行时,您会遇到问题。叉积将导致一个或两个基向量为零,这可能导致二维外观。但只有当您的对象仅在y
彼此之间的轴上偏移时才会发生这种情况。为避免这种情况,您可以在and方向dot
之间测试产品,如果结果大于使用而不是使用(作为向上或向右或其他...)。up
view
abs
0.7
(1,0,0)
此外,由于我们对您的符号一无所知,我们无法确认您的矩阵设置是否正确(可能是也可能不是,它可能被转置等)有关更多信息,请查看:
但很可能您的矩阵也包含透视变换,并且通过设置它的单元格,您将完全覆盖它,导致没有透视图,因此是 2D 输出。在这种情况下,您应该将原始透视矩阵与新矩阵相乘并使用结果。
推荐阅读
- java - 带密码的 ZIP 整个目录
- javascript - 使用 Highcharts renderer.rect 函数时如何删除边框半径
- javascript - 如何将 formData 作为数组对象附加到服务器?
- javascript - 在javascript中使用带有两个运算符的条件语句时如何访问嵌套数组?
- assembly - 变量必须在 pass 1 中定义
- javascript - 与选定节点一起选中的 Kendo Treeview 复选框
- python - 用于数组索引的 Numba 列表参数
- spring-boot - 我正在使用带有 Restful api 服务的 Spring boot jpa 在数组或列表中插入多个用户
- ios - 无法在单元测试项目中读取 Swift 中的 JSON 文件
- python - TypeError:'DataFrame' 对象在 python 3.7 中不能解释为整数