- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在尝试编写一个 View 矩阵/查看矩阵,但我的代码中的某个地方有错误,我需要帮助找到它。当我使用我的函数时,我得到一个空白屏幕,而不是我应该得到的三角形的测试 View 。
public static Mat4 lookAt(
float eyeX, float eyeY, float eyeZ, //Where we are looking from
float centreX, float centreY, float centreZ, //Where we are looking to
float upX, float upY, float upZ) //Which way is up
{
Vec3 eye = new Vec3(eyeX, eyeY, eyeZ);
Vec3 target = new Vec3(centreX, centreY, centreZ);
Vec3 up = new Vec3(upX, upY, upZ);
Vec3 zaxis = normal(subtract(target,eye)); // The "forward" vector.
Vec3 xaxis = normal(cross(up, zaxis)); // The "right" vector.
Vec3 yaxis = cross(zaxis, xaxis); // The "up" vector.
// [ right.x right.y right.z 0]
// [ up.x up.y up.z 0]
// [-forward.x -forward.y -forward.z 0]
// [ 0 0 0 1]
Mat4 orientation = new Mat4(
new Vec4( xaxis.get()[0], yaxis.get()[0], -zaxis.get()[0], +0.0f ), //Column 1
new Vec4( xaxis.get()[1], yaxis.get()[1], -zaxis.get()[1], +0.0f ), //Column 2
new Vec4( xaxis.get()[2], yaxis.get()[2], -zaxis.get()[2], +0.0f ), //Column 3
new Vec4( +0.0f, +0.0f, +0.0f, +1.0f) //Column 4
);
Mat4 translation = new Mat4 (
new Vec4( +1.0f, +0.0f, +0.0f, +0.0f ), //Column 1
new Vec4( +0.0f, +1.0f, +0.0f, +0.0f ), //Column 2
new Vec4( +0.0f, +0.0f, +1.0f, +0.0f ), //Column 3
new Vec4( -eye.get()[0], -eye.get()[1], -eye.get()[2], +1.0f) //Column 4
);
return multiply(orientation, translation);
}
这适用于右手坐标系。所有矩阵都是列主矩阵;它们从 a11 开始构建,向下移动第一列到 a41,然后到 a12,依此类推到 a44。
我已经检查了以下函数,我相当确定它们是正确的,但我将它们包含在内,以防万一我忽略了某些内容:
Vec3 normal(Vec3 a)
{
Vec3 unit;
float[] v_a = a.get();
float v_mag = magnitude(a);
unit = new Vec3(v_a[0]/v_mag, v_a[1]/v_mag, v_a[2]/v_mag);
return unit;
}
--
float magnitude(Vec3 a)
{
float[] v_a = a.get();
return( (float)Math.sqrt(
Math.pow( (double)v_a[0], 2) +
Math.pow( (double)v_a[1], 2) +
Math.pow( (double)v_a[2], 2)
) // -- end sqrt --
); // -- return --
}
--
Vec3 cross(Vec3 a, Vec3 b)
{
Vec3 crossProduct;
float[] v_a = a.get();
float[] v_b = b.get();
crossProduct = new Vec3(
v_a[1]*v_b[2] - v_a[2]*v_b[1], //cx = ay*bz - az*by
v_a[2]*v_b[0] - v_a[0]*v_b[2], //cy = az*bx - ax*bz
v_a[0]*v_b[1] - v_a[1]*v_b[0] //cz = ax*by - ay*bz
);
return(crossProduct);
}
所有 vector 分配都是正确的。 get() 返回一个 float[]。
最佳答案
您似乎正在使用与本页描述的算法类似的算法: http://www.cs.virginia.edu/~gfx/Courses/1999/intro.fall99.html/lookat.html .
看来您否定了方向矩阵中的错误内容。当您实际上应该对方向矩阵中的整个 z 轴 vector 取反时,您对每个轴 vector 的 z 分量取反。
关于java - 计算 LookAt 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22878201/
我正在试验光线行进,并且一直在关注 Jamie Wong's tutorial. 当移动相机部分来时,他们使用该功能 mat4 viewMatrix(vec3 eye, vec3 center, ve
您好,我对glm lookAt函数的返回值有疑问。当我以 Debug模式执行时,此时 glm函数的 ... Result[3][2] = dot(f, eye); ...在矩阵的平移z位置中的值错误。
我正在使用一个在我为 LWJGL 找到的名为 JOML 的开源数学库中计算的 LookAt 矩阵。在我的游戏中获得免费摄像头。它在左右旋转时效果很好,但向上和向下看似乎会导致严重的扭曲问题,类似于大幅
我正在编写 3d 引擎,并且遇到了 DirectX 文档中描述的 LookAt 算法: zaxis = normal(At - Eye) xaxis = normal(cross(Up, zaxis)
在虚幻中,我想要 在前向 vector 指向目标当前位置的位置旋转角色, 确保我的 Actor 的向上 vector 与我的目标的向上 vector 相同 在Unity3D中,它 super 简单。这
我在 OpenGL 2.0(固定管道)中构建了一个 lookAt 相机。我的相机跟踪它的位置、观察点和向上 vector 。到目前为止,我已经使用以下代码将相机偏转了一定程度: void Camera
我正在使用 Three.js 透视相机,我需要了解相机所注视的点。 如何使用相机的矩阵/旋转向量计算它? 最佳答案 相机向下看它的内部负 z 轴。所以选择相机负 z 轴上的任意点,如下所示: var
我尝试使用 Lookat 功能通过平移手势旋转相机。我使用 swift 和 Metal(在本例中 Metal 与 OpenGLES 的工作原理相同)。这是我的代码 查看功能: let kEye =
我在谷歌上进行了广泛的搜索,但我还没有找到我认为实际上很常见的情况的解决方案。假设我有一个THREE.PerspectiveCamera初始化为查看空间中的某个点: var camera = new
我正在使用 glm::lookAt 获取一个矩阵来改变世界。这工作正常,我可以生成矩阵,将其输入着色器,一切正常。我现在需要做的是通过 lookAt 矩阵转换任意 vector (即 100,100,
我目前正在尝试使用 Source SDK 在 C++ 中编写一个 LookAt 函数。我做了一些研究,发现了很多链接,但其中很多都是关于 Unity 或 Glm 的,并且使用的是四元数和旋转矩阵,但我
假设我有以下顶点着色器代码: attribute vec4 vPos; uniform mat4 MVP; uniform mat4 LookAt; void main{ gl_Positi
我一直在尝试编写一个 View 矩阵/查看矩阵,但我的代码中的某个地方有错误,我需要帮助找到它。当我使用我的函数时,我得到一个空白屏幕,而不是我应该得到的三角形的测试 View 。 public st
据我所知,“lookat”方法是在场景中放置/旋转相机的最简单方法之一。所以我在我的光线追踪代码中实现了 ( https://www.scratchapixel.com/lessons/mathema
大家好,我正在尝试做一个使用 glm 库中的 lookAt 的 Camera 类。我有 4 个点,第一个是 eye,即相机在空间中的位置,第二个是 look,即相机正在注视的点,第三个是 upp,用于
我正在努力解决以下问题。我正在处理骨骼动画,我希望(即)玩家的头部跟随空间中的另一个物体。我的上轴是 +Z 我的前轴是 +Y,四元数的大小在 W 中。我尝试使用 gluLookAt 的 mesa 代码
我需要设置场景的初始“lookAt”点,这将是屏幕和控件旋转的中心。如果可能的话,我更愿意设置一个点(或一个对象的位置),而不是旋转 Angular 。 控件是OrbitControl。如果我只是在控
我正在关注 tutorial学习 OpenGL,他们使用 glm::lookAt() 函数来构建 View ,但我无法理解 glm::lookAt() 的工作原理,显然,有没有 GLM 的详细文档。谁
在 SparkAR 中,我想要一个元素(称为 toRotate),它总是看着相机,类似于已经问过的 here (但接受的解决方案对我来说并不令人满意,我没有足够的声誉来回答它的评论)。 问题在于该元素
在 Three.js 中,我希望相机指向 3D 空间中的某个点。 为此,我尝试使用 camera.lookAt 函数,如下所示: camera.lookAt(new THREE.Vector3(-10
我是一名优秀的程序员,十分优秀!