javascript - 了解three.js中的定位系统
问题描述
我是 javascript 和 three.js 的新手,我正在尝试弄清楚如何在网页上获取 3d 位置。例如。我想在 (50,20,10) x,y,z 值处设置一个点光源。我怎么知道这个 x,y,z 值将出现在网页上的哪个位置?。我看到了如下代码。
var light2 = new THREE.PointLight(0xffffff, 10)
light2.position.set(500, 100, 0)
scene.add(light2)
解决方案
先说一点背景...
- 3D空间是无限的。
- 画布是该空间的视口。
- 页面上画布的大小与 3D 空间中的任何内容都没有直接关系。您可以将画布的大小加倍,它所做的只是使渲染的图像更大。
对于你的问题...
这并不是说您无法确定 3D 事物可能会出现在画布上的哪个位置。您可以使用 将 3D 空间中的任何点投影到标准化设备坐标中Vector3.project
。
var light2 = new THREE.PointLight(0xffffff, 10)
light2.position.set(500, 100, 0)
scene.add(light2)
// Where is it in NDC?
var ndc = new THREE.Vector3().copy( light2.position ).project( camera );
规范化设备坐标的范围从-1
到,并表示在渲染图像的中心处1
的视口的规范化宽度和高度。(0,0)
因此,您需要将它们从 NDC 转换为画布上的像素值。(此外,您可以忽略该z
组件,因为屏幕没有深度。)
var canvasX = ( ndc.x + 1 ) * canvasWidth / 2;
var canvasY = ( ndc.y + 1 ) * canvasHeight / -2;
推荐阅读
- json - Apache Spark 读取带有额外列的 JSON
- android - Android 前台服务
- php - PHP 类属性在构造函数中初始化时为空
- python - 使用 matplotlib 在 4-D 数据中插入颜色
- sql - 计算每季度的平均值
- angular - 角度错误:找不到模块“firebase/app”
- firebase - 如何将 Firebase RTDB 与 Flutter Stream 结合使用
- angular - 如何在 Angular 5 应用程序中正确保存日期?
- ios - tableView.reloadData() 只调用一次
- python - 为什么“in”运算符能识别子字符串而不识别子列表?