- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个游戏,我在其中使用 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/
我不确定这是否是 SwiftUI 特定的问题。无论如何,我有一个 UIImagePickerController,我通过使用 UIViewControllerRepresentableProtocol
我正在尝试将一个 materialbutton 小部件制作成一个正方形。我想要其中的 4 个按钮形成它们自己的正方形。像这样: 所以我尝试了这个: @override Widget build(B
我试图在 JQueryUI 可调整大小中动态打开/关闭纵横比,但是即使将选项设置为 false 后,它仍然保持纵横比。以下是我当前正在使用的代码: $('#aspect_check').click(
我正在尝试在我的应用程序中使用 Jcrop,尽管我遇到了一个错误。我去了演示页面,那里也存在这个错误。以下是创建方法。 转到此演示页面 http://deepliquid.com/projects/J
如果我尝试更改图表的 aspectRatio,那么我将无法做到。此页面还表明它应该是可能的。 https://www.chartjs.org/docs/latest/developers/update
我正在尝试使用 Swift UI 实现以下布局…… struct ContentView : View { var body: some View { List(1...5)
我想将大图像缩小为位图并将其适合 Canvas 。我找到了一个效果很好的解决方案,但是有一个问题,它给位图提供了黑色背景。我只想要透明背景的图像..!这是代码.. Bitmap scaleDownLa
我是 React Native 的新手。我正在探索 layout 属性 here但我无法理解 aspectRatio 属性,因为它在 CSS 中不存在。但是在做了一些研究之后,我对这个属性有了一点了解
这是我第一次尝试的方法: $('#thumbnail').imgAreaSelect({ x1: 5, y1: 5, x2: $('#thumbnail').width(),
我正在创建一个游戏,我在其中使用 aspectRatio、y_scale、x_scale 和 frustum_length 计算 View 矩阵,所以我想知道是否有一种方法可以仅使用这些变量来计算视锥
我在 Storyboard 中有一个 UIImageView,AspectRatio 是 1:1,在某些情况下我想在 ViewController 中以编程方式更改为 2:1。我在 ViewContr
根据 Apple 的文档,矩形检测请求的最大和最小纵横比的值范围为 0.0 到 1.0。我相信纵横比定义为宽度/高度,这是否意味着视觉框架无法检测宽度大于高度的矩形?使用大于 1.0 的值测试纵横比不
当我如下设置修饰符时 class MainActivity: AppCompatActivity() { override fun onCreate(savedInstanceState: B
我是一名优秀的程序员,十分优秀!