我想要一个透视相机和一个相互垂直的相机.它们处于相同的位置、方向,zar平面也完全相同. 问题是,即使近处和远处的值是相同的,我得到的z值也不同,遮挡是错误的.想要我失踪吗?

const perspective_camera = new PerspectiveCamera(55, canvas.width / canvas.height, near, far);
const half_width = perspective_camera.far * Math.tan(perspective_camera.fov * 0.5 * (Math.PI / 180));
const half_height = half_width / perspective_camera.aspect;
const ortho_camera = new OrthographicCamera(-half_width, half_width, half_height, -half_height, near, far);
// Here one example of the problem in the Z
const aux1 = new Vector3(0, 0, 1);
const aux2 = new Vector3(0, 0, 1);
console.log(aux1.project(ortho_camera), aux2.project(half_height));
// Object { x: -0.00003130777409465268, y: -0.000001186705638256526, z: -0.999202652754963 }
// Object { x: -0.07660902355148393, y: -0.0029038270148180447, z: 0.9510807024824749 }

推荐答案

透视投影的Z坐标不是线性的.见How to render depth linearly in modern OpenGL with gl_FragCoord.z in fragment shader?.为了补偿这一点,必须计算一个坐标,在正交投影之后,该坐标将导致具有与透视投影相同的z分量的坐标.基本上,你必须投影透视和取消投影正交.见第Transpose z-position from perspective to orthographic camera in three.js条.由于正投影矩阵和透视投影矩阵不同地投影场景,因此不幸的是,场景在世界空间和视图空间中都不相同.因此,没有简单的解决方案来解决您的问题.我能看到的唯一可能性是在顶点着色器中执行特殊的转换.但是,在这种情况下,您必须使用自己的特殊material 渲染场景.

Typescript相关问答推荐

如何正确修复TypScript 4.7到4.8升级中的TS 2345编译错误

类型{...}的TypeScript参数不能赋给类型为never的参数''

将对象属性转换为InstanceType或原样的强类型方法

有没有办法解决相互影响的路由之间的合并?

如何提取密钥及其对应的属性类型,以供在新类型中使用?

打印脚本中的动态函数重载

在对象中将缺省值设置为空值

在保留类型的同时进行深层键名转换

ANGLE订阅要么不更新价值,要么不识别价值变化

当数组类型被扩展并提供标准数组时,TypeScrip不会抱怨

在Thunk中间件中输入额外参数时Redux工具包的打字脚本错误

使用RXJS获取数据的3种不同REST API

来自枚举的<;复选框和组件列表

数据库中的表请求返回如下日期:2023-07-20T21:39:00.000Z 我需要将此数据格式化为 dd/MM/yyyy HH:mm

Next 13 + React 18 createContext 类型的构建问题

带有过滤键的 Typescript 映射类型

从 npm 切换到 pnpm 后出现Typescript 错误

使用嵌套属性和动态执行时,Typescript 给出交集而不是并集

为什么我无法在 TypeScript 中重新分配函数?

如何让 Promise 将它调用的重载函数的类型转发给它自己的调用者?