gpt4 book ai didi

java - 是否可以仅使用 : aspectRatio, y_scale、x_scale 和 frustum_length 来计算视锥体?

转载 作者:行者123 更新时间:2023-11-30 10:06:14 24 4
gpt4 key购买 nike

我正在创建一个游戏,我在其中使用 aspectRatio、y_scale、x_scale 和 frustum_length 计算 View 矩阵,所以我想知道是否有一种方法可以仅使用这些变量来计算视锥体。

变量:

float aspectRatio = (float)Display.getWidth() / (float)Display.getHeight();
float y_scale = (float) ((1f / Math.tan(Math.toRadians(FOV / 2f))) * aspectRatio);
float x_scale = y_scale / aspectRatio;
float frustum_length = FAR_PLANE - NEAR_PLANE;

最佳答案

透视投影对称时,(y轴)视场角FOV , 纵横比 aspectRatio并给出到近平面(NEAR_PLANE)和远平面(FAR_PLANE)的距离,则可以计算出视空间中视锥体的8个角点:

float aspectRatio = (float)Display.getWidth() / (float)Display.getHeight();

float y_scale = 1.0f / (float)Math.tan( Math.toRadians(FOV / 2.0) );
float x_scale = y_scale * aspectRatio;

float near_x = NEAR_PLANE * x_scale;
float near_y = NEAR_PLANE * y_scale;

float far_x = FAR_PLANE * x_scale;
float far_y = FAR_PLANE * y_scale;

Vector3f left_bottom_near = new Vector3f(-near_x, -near_y, FAR_PLANE);
Vector3f right_bottom_near = new Vector3f( near_x, -near_y, FAR_PLANE);
Vector3f left_top_near = new Vector3f(-near_x, near_y, FAR_PLANE);
Vector3f right_top_near = new Vector3f( near_x, near_y, FAR_PLANE);

Vector3f left_bottom_far = new Vector3f(-far_x, -far_y, FAR_PLANE);
Vector3f right_bottom_far = new Vector3f( far_x, -far_y, FAR_PLANE);
Vector3f left_top_far = new Vector3f(-far_x, far_y, FAR_PLANE);
Vector3f right_top_far = new Vector3f( far_x, far_y, FAR_PLANE);

如果你想知道世界空间中视锥的8个角点,那么这些点必须从 View 空间转换到世界空间。
从世界空间转换到 View 空间的矩阵是“ View ”矩阵。可以从 View 空间转换到世界空间的矩阵是逆 View 矩阵( invert() )。
逆 View 矩阵是由 View 的 View 位置、 View 方向和 View 的上 vector 定义的矩阵。 Matrix4f 可以设置如下:

Vector3f eyePos;    // position of the view (eye position)
Vector3f targetPos; // the point which is looked at
Vector3f upVec; // up vector of the view
Vector3f zAxis = Vector3f.sub(eyePos, targetPos, null);
zAxis.normalise();

Vector3f xAxis = Vector3f.cross(upVec, zAxis, null);
xAxis.normalise();

Vector3f yAxis = Vector3f.cross(zAxis, upVec, null);

Matrix4f inverseView = new Matrix4f();
inverseView.m00 = xAxis.x; inverseView.m01 = xAxis.y; inverseView.m02 = xAxis.z; inverseView.m03 = 0.0f;
inverseView.m10 = yAxis.x; inverseView.m11 = yAxis.y; inverseView.m12 = yAxis.z; inverseView.m13 = 0.0f;
inverseView.m20 = zAxis.x; inverseView.m21 = zAxis.y; inverseView.m22 = zAxis.z; inverseView.m23 = 0.0f;
inverseView.m30 = eyePos.x; inverseView.m31 = eyePos.y; inverseView.m32 = eyePos.z; inverseView.m33 = 1.0f;

注意, View 空间的坐标系是Right-handed系统,其中 X 轴指向左侧,Y 轴指向上方,然后 Z 轴指向 View 外(请注意,在右手系统中,Z 轴是 X 轴和Y 轴)。

最后角点可以通过矩阵进行变换:

例如

Vector4f left_bottom_near_v4 = new Vector4f(
left_bottom_near.x, left_bottom_near.y, left_bottom_near.z, 1.0f
);

Vector4f left_bottom_near_world_v4 = new Vector4f();
Matrix4f.transform(Matrix4f left, left_bottom_near_v4, left_bottom_near_world_v4);

Vector3f left_bottom_near_world = new Vector3f(
left_bottom_near_world_v4 .x, left_bottom_near_world_v4 .y, left_bottom_near_world_v4 .z
);

关于java - 是否可以仅使用 : aspectRatio, y_scale、x_scale 和 frustum_length 来计算视锥体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54753683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com