javascript - 如何在 Three.js 工作区中围绕随机 3d 对象/网格/3d 线的轴旋转网格组?
问题描述
我正在尝试了解有关three.js 的更多信息,以便我可以对一个简单的机制进行测试。最终,所需的输出将是针对不同设计的板倾斜(前视图)到轴方向(平面图)。(XY图),但这显然是第五或第六步。我被困在第一步,试图了解如何获得一个旋转轴,由一个小直径的圆柱体表示。
- 我希望利用 Three.js 中现有的矩阵工具来执行数据图表/系统分析。
- 目前尚不清楚网格对象中的 worldMatrix 对象真正代表什么。我认为它包含位置、方向和缩放因子,但不清楚如何提取该信息以用于世界空间中其他组件的平移/3d 旋转。
- 我猜我最好复制原始组件位置和矩阵值,然后处理这些副本。当你再次左右倾斜时,你不会回到原来的位置。
该模型代表一个简单的滑板。根据用户选择的滑块元素,我想围绕倾斜轴旋转前卡车吊架(包含一个轴和两个轮子)。
var euler;
const rotateMeshGroup =( meshGroup, rotationAxis, angleOfRotation) =>{
euler = new THREE.Euler().setFromRotationMatrix(rotationAxis.matrixWorld);
meshGroup.children.forEach(item => {
item.rotateOnAxis(euler, THREE.MathUtils.degToRad(angleOfRotation));
})
}
我不明白如何创建旋转轴。我理解的 3D 角度,但是与轴的距离呢?这是矩阵叉积计算(到 3D 轴的最短距离,距离垂直于轴?)
编辑:仍在尝试解决这个问题。一直在通过大量的 console.logs,我在罐装矩阵中看不到任何可行的东西。我已将枢轴从一个小直径圆柱网格对象转换为由两个矢量端点定义的简单线。我现在正在考虑 RotateMeshGroup 函数中的 delta-x、delta-y、delta-z 计算(平移、旋转、向后平移)。
这里有任何提示和提示吗?
解决方案
所以,是的,这是一项正在进行的工作。而我现在已经远远超出了这一点。对我来说,这是一个使用 Three.js 进行工程相关分析的学习练习。我想分享一些我学到的技巧。
我发现这篇帖子的答案来自“Q 中的陌生人” 代码是一个旋转的太阳系,有太阳、地球(有旋转的月亮和岩石)和火星(有另外两个行星)。我非常仔细地阅读了这个例子,理解,真正理解正在发生的一切。该程序清楚地说明了旋转是如何传播给孩子的(月球围绕地球旋转,而地球围绕太阳旋转,等等......)内容由 ThreeJS 场景外部的一个简单对象管理。该程序使用一些递归函数来管理动画功能中子元素的动作。需要进行一些更新,例如 THREE.Object3d 的构造函数不再使用名称。纠正措施是在对象创建后简单地添加名称值。当您准确地命名所有内容时,更容易理解整个子层次结构。
我发现的另一件事是来自 BadAskTechie 的回复帖子,回复很简单,而且直截了当。
//rotates a mesh's geometry about a specified axis and pivot //the axis is a normalized Vector3 const rotateAbout = (mesh, axis, axisPosition, angle) => { mesh.geometry.applyMatrix(new THREE.Matrix4().makeTranslation(mesh.position.x-axisPosition.x, mesh.position.y-axisPosition.y, mesh.position.z-axisPosition.z)); //translate geometry to axis location mesh.geometry.applyMatrix(new THREE.Matrix4().makeRotationAxis(axis, angle)); //rotate geometry about axis mesh.geometry.applyMatrix(new THREE.Matrix4().makeTranslation(axisPosition.x-mesh.position.x, axisPosition.y-mesh.position.y, axisPosition.z-mesh.position.z)); //translate geometry back to original location }
复杂嵌套 3d 网格的一个技巧。在 THREE.abcGeometry 对象阶段完成所有几何工作,包括零部件方向/平移/旋转。不要创建网格然后尝试在场景空间中定向对象。当您在几何体中进行平移和旋转时,动画制作时一切都会完美排列。直到我尝试,没有什么是有意义的。轴线方向似乎都混在一起了。
我发现有一种技术很有用。我想知道在旋转/动画功能期间我的元素在 3d 空间中的位置。我不知道如何在 3d 网格物体上做到这一点。有太多的顶点无用。相反,我创建了一个简单的线对象,并在旋转过程中将其与组件的其余部分一起操纵。在临时移动之后,我可以通过检查它的两个顶点来查询这条线,创建一个新的 3d vector.normalize() 并在未来的计算中使用它。这似乎工作得很好。
我上面提出的问题实际上已被整个滑板卡车模型问题的大量进展所取代。上面沙箱中的一些代码很糟糕。请不要浪费时间看它。相反,我认为我要做的是开源已完成的项目,并在此处列出 github repo 链接和演示,以便其他人可以一睹我的进度。
也许这对其他学习 ThreeJS 的人有用。
推荐阅读
- quasar - Quasar 在表格分页标签中更改单词“of”
- javascript - 无法在 Angular 模板中呈现内容
- sql - SQL Server:将数百万行从一个视图移动到另一个表
- c# - 功能
事件和头痛 - c++ - 是否有用于确定不超过数字 x 的最大元素的 std::set 函数?
- java - 以递归方式使用 java 8 CompletableFuture
- python - 使用 django 捕获网络摄像头图像并上传数据库
- linux - 让特定用户完全访问我拥有的任何东西 linux
- testing - 我可以使用嵌入式 iframe 吗?
- mysql - 我需要获取用户首次付款日期和用户注册日期之间的差值