我设法开展了一个调查。 在一台摄像机中,由于有许多消息来源称了这一点。
我一直在试图从摄像机中翻译这一内容。 模型研究 页: 1 我似乎不能让它发挥作用,我认为我对如何构建一个矩阵有一点误解。 我的假设是,我不需要改变对模型的翻译,以便看一看问题,因为我的立场应该保持不变。
首先是相关的法典。 监督员的职能应参照翻译(即:职位=方向)的相同参照基准。 然而,有一些问题,我用屏幕显示这些问题。 它没有检查方向1.0f或1.0f,而是微不足道。
void TransformMatrix3D::lookAtRadians(float atX, float atY, float atZ, float toZRadians)
{
Vector3D direction(atX - x(), atY - y(), atZ - z());
direction.normalize();
Vector3D up(0.0f, 1.0f, 0.0f);
Vector3D right(direction.crossProduct(up));
right.normalize();
up = direction.crossProduct(right);
mMatrix[0] = right.x();
mMatrix[4] = right.y();
mMatrix[8] = right.z();
mMatrix[1] = up.x();
mMatrix[5] = up.y();
mMatrix[9] = up.z();
mMatrix[2] = direction.x();
mMatrix[6] = direction.y();
mMatrix[10] = direction.z();
}
这里是交叉产品,如果功能不正确,则是正常的。
Vector3D Vector3D::crossProduct(const Vector3D& rightVector) const
{
const float NEW_X(y() * rightVector.z() - z() * rightVector.y());
const float NEW_Y(z() * rightVector.x() - x() * rightVector.z());
const float NEW_Z(x() * rightVector.y() - y() * rightVector.x());
return Vector3D(NEW_X, NEW_Y, NEW_Z);
}
void Vector3D::normalize()
{
float length(x() * x() + y() * y() + z() * z());
if(fabs(length) == 1.0f)
return;
length = 1.0f / sqrt(length);
moveTo(x() * length, y() * length, z() * length);
}
这里是描述我问题的一些屏幕。 白人领域指 look点。
我在Z axis(将分别建立mMatrix[12]
、mMatrix[13]
和mMatrix[14]
至0.0f、0.0f、-10.0f>。 表格的其余部分是身份。 我已核实情况是这样,我将用来证明问题。
如果我转而去看 仅仅在X和Y轴线上,看着 似乎工作正确。
However, when I combine the two (i.e. move the lookAt point so both X and Y aren t 0.0f), some Z rotation is applied, which shouldn t happen since UP x DIRECTION should always result in the RIGHT.y() being 0.0f. The Z rotation will be applied using toZRadians
(which is not yet implemented).
筛查:
我还发现,如果我这样去找工作的话。 在Y轴线下,该模型仍然沿循着线。 当时,它实际上围绕全球X轴(或至少相当于X轴)进行轮换。 现在,看上去 此时此刻,该模式有正确的Y轮轮换,但X轮轮换没有改变。 我在这一点上检查了我的病媒,我发现UP.y()是负面的,它不可能(它可以是0.0f,但不是消极的),因为DIRECTION和RLI应当总是以同样的方式(即从DIRECTION到RLI的锁定)。 唯一可能消极的办法是,如果权利是实际的LEFT的话。