我已经搜索了很长时间,但找不到这个看似简单的问题的答案。我有一个3d空间,我的相机有x、y、z、偏航、俯仰和滚动变量,我希望能够将相机向前移动到我所看到的任何地方。大多数相机类都有类似的功能:
//moves the camera forward relitive to its current rotation (yaw)
public void walkForward(float distance)
{
position.x -= distance * (float)Math.sin(Math.toRadians(yaw));
position.z += distance * (float)Math.cos(Math.toRadians(yaw));
}
这对于根据偏航向前移动很有效,但y位置永远不会改变。如何将其更改为也与您的音高相关,以便您始终朝着相机所看到的方向移动?
编辑:
我所说的向前移动是指在每个轴上移动一定数量的相机,这个数量取决于你的偏航、俯仰和滚动,无论你面前是什么,都会变得更大。这可以用来:
position.x += -Math.sin(Math.toRadians(rotation.y)) * Math.cos(Math.toRadians(rotation.x)) * distance;
position.z += Math.cos(Math.toRadians(rotation.y)) * Math.cos(Math.toRadians(rotation.x)) * distance;
position.y -= -Math.sin(Math.toRadians(rotation.x)) * distance;
注:旋转。y=偏航,旋转。x=俯仰、旋转。z将是滚动。距离就是移动的距离,比如说0.1。
如果你不改变相机的滚动(在z轴上旋转),这会起作用,否则不会。这篇文章可能与现在的很相似,但我不知道如何将矩阵乘法应用到我的相机类中
public class Camera
{
// Field Of View
private float fov;
// Aspect Ratio
private float aspect;
// Near Plane
private float zNear;
// Far Plane
private float zFar;
// Projection matrix
private Matrix4f projection;
// View matrix
private Matrix4f view;
// Camera position
private Vector3f position;
// Camera rotation
private Vector3f rotation;
// Vectors for axes
private Vector3f xAxis, yAxis, zAxis;
/**
* Creates a simple 3D Perspective Camera.
*
* @param fov The field of view in degrees.
* @param aspect The aspect ratio.
* @param zNear The near clipping plane.
* @param zFar The far clipping plane.
*/
public Camera(float fov, float aspect, float zNear, float zFar)
{
// Set the local variables
this.fov = fov;
this.aspect = aspect;
this.zNear = zNear;
this.zFar = zFar;
// Create matrices
projection = MatrixUtil.createPerspectiveProjection(fov, aspect, zNear, zFar);
view = MatrixUtil.createIdentityMatrix();
// Initialize position and rotation vectors
position = new Vector3f(0, 0, 0);
rotation = new Vector3f(0, 0, 0);
// Create normalized axis vectors
xAxis = new Vector3f(1, 0, 0);
yAxis = new Vector3f(0, 1, 0);
zAxis = new Vector3f(0, 0, 1);
// Enable depth testing
glEnable(GL_DEPTH_TEST);
}
/**
* Apply the camera's transformations.
*/
public void apply()
{
// Make the view matrix an identity.
view.setIdentity();
// Rotate the view
Matrix4f.rotate((float) Math.toRadians(rotation.x), xAxis, view, view);
Matrix4f.rotate((float) Math.toRadians(rotation.y), yAxis, view, view);
Matrix4f.rotate((float) Math.toRadians(rotation.z), zAxis, view, view);
// Move the camera
Matrix4f.translate(position, view, view);
}
//moves the camera forward relitive to its current rotation (yaw and pitch)
public void moveForward(float distance)
{
position.x += -Math.sin(Math.toRadians(rotation.y)) * Math.cos(Math.toRadians(rotation.x)) * distance;
position.z += Math.cos(Math.toRadians(rotation.y)) * Math.cos(Math.toRadians(rotation.x)) * distance;
position.y -= -Math.sin(Math.toRadians(rotation.x)) * distance;
}
(此摄影机类基于本教程)
那么,我怎样才能使相机根据偏航、俯仰和滚动向前移动呢。
您有3个旋转:滚动、偏航和俯仰。这些也可以想象为在三维空间中的平面上绘制的磁盘上的点:xy平面(滚动)、xz平面(偏航)、zy平面(俯仰)。
为了帮助你想象这一点,想象你在一个立方体里。立方体有6个面,每个面都画了一个圆。你下面和上面的两个面是xz平面;你的右边和左边是zy平面;前后是熟悉的xy平面。
您的示例是围绕xz平面上绘制的圆的中心旋转。当飞机偏航时,它显然不会改变其俯仰。滚动(xy)看起来像:
position.x -= distance * (float)Math.cos(Math.toRadians(amount));
position.y += distance * (float)Math.sin(Math.toRadians(amount));
您可能必须更改标志,因为我不确定这是如何实现的。
在xy平面(典型的2d视图)上,如果绘制半径为r的圆,则圆上角度θ处的任何点都可以由P(r*cos(θ),r*sin(θ))给出。在三维空间中,有3个平面,必须在所有平面上应用相同的逻辑,才能找到该平面上旋转的适当值。
不过,我不知道你说的“向前移动相机”是什么意思。
我试图创建一个第一人称相机。我从我的XNA项目中提取了一段代码,并试图将其转换为java(LWJGL)。 如果我移动鼠标,俯仰和偏航会增加/减少。在开始运行我的游戏时,它运行良好,但在一些动作后,我无法向下或向上看。如果我的位置是 性能良好的XNA代码: 所以我发现LWJGL和XNA在旋转矩阵方面有一些不同。 Java: 结果: {1.0 0.0 0.0 0 0.0}{0.0 0.3299931-
我正在用LWJGL开发一个3D游戏,我想添加一个支持鼠标的第一人称相机。我现在有一个,但它并不顺利,一点也不好用。我真的希望窗口也能聚焦,这样鼠标就可以启动,而不是在窗口上悬停。我如何实现这一点? 以下是我当前的摄像头实现:
虽然我熟悉OpenGl(LWJGL),但我目前正在进行一个小型fps项目的测试。我这里的问题是相机的旋转不是很平稳。它从一个像素跳到另一个像素,这实际上非常明显。我怎样才能把它弄平滑呢?[链接到片段:]https://www.youtube.com/watch?v=6Hgt1hXCKKA 代码摘要:我将当前鼠标位置存储在Vector2f中; 我通过相机的相对运动增加偏航和俯仰(新位置-旧位置);
我正在为我的儿子做一个项目,我们将有一个远程Pi Zero,带有一个摄像头和各种传感器和执行器,通过有线以太网连接到一个PI3,作为一个带有Scratch GUI的控制器。 似乎我可以得到一个本地摄像机发送视频到Scratch项目的后台,或者我可以得到一个远程摄像机流回例如VLC播放器使用RTSP。 我想教我的儿子如何在Pi3上建立一个scratch GUI来远程控制Pi Zero上的传感器和执行
问题内容: 我正在开发一个可以显示一些3D模型的应用程序。我们加载模型,创建网格,将其添加到场景中…标准过程。添加最后一个网格后,我们使用总几何尺寸和视口尺寸进行数学运算,从而计算出边界框以移动摄像机并覆盖所有场景。 是包含边框的宽度和高度的对象。经过此计算,我们移动了相机(加上一点点比例,只是为了美观,我们希望在几何体和屏幕边框之间留出一点空间:))并进行渲染 到目前为止,这已实现并且可以正常运
这一摄像机使用orthographic projection(正交投影)来进行投影。 在这种投影模式下,无论物体距离相机距离远或者近,在最终渲染的图片中物体的大小都保持不变。 这对于渲染2D场景或者UI元素是非常有用的。 代码示例 const camera = new THREE.OrthographicCamera( width / - 2, width / 2, height / 2, hei