hen*_*ack 2 javascript three.js
我希望在挤压过程中旋转形状,以显示绕 Z 轴的“扭曲”效果,如下所示
\n\n\n\n和这里
\n\n\n\n我生成这个扭曲立方体的尝试如下:
\n\nvar squareShape = new THREE.Shape();\nsquareShape.moveTo(10,0);\nsquareShape.lineTo(0,10);\nsquareShape.lineTo(-10,0);\nsquareShape.lineTo(0,-10);\nsquareShape.lineTo(10,0);\n\n\nvar extrudeSettings={amount:10, bevelEnabled:false};\nvar geometry = new THREE.ExtrudeGeometry( gearShape, extrudeSettings );\nRun Code Online (Sandbox Code Playgroud)\n\n显然,这只会沿着 z 轴直线挤压形状。使用geometry.applyMatrix();似乎不可能将立方体剪切成绕z轴的扭曲。
\n\n做到这一点的唯一方法可能是在挤压时将某些内容硬编码到 2D 形状的法线、双法线和切线中。我相信答案就在 extrudePath \xe2\x80\x94 THREE.CurvePath 和frames-THREE.TubeGeometry.FrenetFrames 内,但不确定是否有更简单的方法。
\n\n任何有关此事的帮助将不胜感激!
\n如果您知道顶点创建面的 z 值,则可以将网格扭转特定的螺旋角。在这种情况下,我们将所有具有 az 值(如果宽度/2)的顶点旋转一定角度...
function twistMesh(mesh, helixAngle, width) {
for (var i = 0; i < mesh.geometry.vertices.length; i++) {
if (mesh.geometry.vertices[i].z == width/2.0) {
var updateX = mesh.geometry.vertices[i].x * Math.cos(helixAngle)
- mesh.geometry.vertices[i].y * Math.sin(helixAngle);
var updateY = mesh.geometry.vertices[i].y * Math.cos(helixAngle)
+ mesh.geometry.vertices[i].x * Math.sin(helixAngle);
mesh.geometry.vertices[i].x = updateX;
mesh.geometry.vertices[i].y = updateY;
}
}
return mesh;
}
Run Code Online (Sandbox Code Playgroud)
您还可以通过以下方式使网格逐渐变细...
function taperMesh(mesh, scaleFactor, width) {
for (var i = 0; i < mesh.geometry.vertices.length; i++) {
if (mesh.geometry.vertices[i].z == width/2.0) {
var updateX = mesh.geometry.vertices[i].x * scaleFactor;
var updateY = mesh.geometry.vertices[i].y * scaleFactor;
mesh.geometry.vertices[i].x = updateX;
mesh.geometry.vertices[i].y = updateY;
} else {
}
}
return mesh;
}
Run Code Online (Sandbox Code Playgroud)