javascript - 动态更改顶点位置后网格位置无效
问题描述
我尝试使用 PlaneGeometry 创建网格。在我动态更改几何的顶点后,mesh.position 和 mesh.rotation 之后不正确。是否可以使用新顶点相应地重新计算这些?
我尝试这样做:
var geometry = new THREE.PlaneGeometry(500, 500);
geometry.dynamic = true;
var material = new THREE.MeshBasicMaterial({
side: THREE.DoubleSide
});
var plane = new THREE.Mesh(geometry, material);
scene.add(plane);
geometry.vertices[0].x += 15;
geometry.vertices[1].x += 15;
geometry.vertices[2].x += 10;
geometry.vertices[3].x += 10;
geometry.verticesNeedUpdate = true;
这里 plane.position 仍然是 Vector3(0, 0, 0)。如何将其更新为正确的位置?
解决方案
位置和顶点是独立的东西。网格可能位于(0, 0, 0)
但绘制在完全不同的位置,因为它的顶点都是大数。因此,顶点位置是相对于对象位置的位置。对于您的飞机new THREE.PlaneGeometry(500, 500)
:
(-250, 250, 0) (250, 250, 0)
*--------------------------*
| |
| |
| |
| (0, 0, 0) |
| O |
| |
| |
| |
*--------------------------*
(-250, 250, 0) (250, -250, 0)
O
在这种情况下是起源。在你的转变之后:
(-235, 250, 0) (265, 250, 0)
*--------------------------*
| |
| |
| |
| (0, 0, 0) |
| O |
| |
| |
| |
*--------------------------*
(-240, 250, 0) (260, -250, 0)
你得到一个稍微移动的平行四边形,但原点没有移动,因为你从未要求原点移动。可以有一个看起来像这样的形状:
(500, 250, 0) (750, 250, 0)
*--------------------------*
| |
| |
| |
(0, 0, 0) | |
O | |
| |
| |
| |
*--------------------------*
(500, 250, 0) (750, -250, 0)
它仍然完全有效。你想做什么?通过移动顶点位置来移动网格绝对不是一个好习惯,但看起来好像您也在尝试使网格变形。如果出于某种原因您需要独立移动网格顶点,但始终希望网格的位置位于其中心:
var boundingBox = new THREE.Box3().setFromObject(mesh);
var centerDisplacement = boundingBox.getCenter().sub(mesh.position); // Difference between your mesh's position and its center
geometry.vertices[0].add(centerDisplacement);
geometry.vertices[1].add(centerDisplacement);
geometry.vertices[2].add(centerDisplacement);
geometry.vertices[3].add(centerDisplacement);
geometry.verticesNeedUpdate = true;
推荐阅读
- excel - 用于 Excel 工作表的 Podio 项目
- r - R:将年度指标变量转换为单年变量
- javascript - 为什么 DOM 点击事件需要这么长时间?
- javascript - 角度路由/导航无法正常工作:附加而不是替换组件
- php - php date() 提前 1 天给出结果
- html - 输入 type="checkbox" 在 Outlook 上发送的 HTML Mailer 上损坏
- sql - Vertica:将 Bitstrint 转换为整数
- sql - Transform table using Cross Apply
- java - How to verify that IntentionAction was called on an interface file? IntelliJ Platform SDK
- google-cloud-platform - 使用 Plesk 减少谷歌云实例上的启动磁盘大小