【问题标题】:How do I rotate a triangle around an edge?如何围绕边缘旋转三角形?
【发布时间】:2018-06-08 04:28:04
【问题描述】:

用three.js 制作的三角形如何围绕其边缘之一旋转?当我尝试旋转它时,它看起来像它的中心一样。

三角形由以下组成:

var triangleMesh; 
var triangleGeometry = new THREE.Geometry(); 
    triangleGeometry.vertices.push( new THREE.Vector3( 0.0, 1.0, 0.0 ) ); 
    triangleGeometry.vertices.push( new THREE.Vector3( -1.0, -1.0, 0.0 ) ); 
    triangleGeometry.vertices.push( new THREE.Vector3( 1.0, -1.0, 0.0 ) ); 

    triangleGeometry.faces.push( new THREE.Face3( 0, 1, 2 ) ); 

    triangleGeometry.faces[0].vertexColors[0] = new THREE.Color(0xFF0000); 
    triangleGeometry.faces[0].vertexColors[1] = new THREE.Color(0x00FF00); 
    triangleGeometry.faces[0].vertexColors[2] = new THREE.Color(0x0000FF); 

var triangleMaterial = new THREE.MeshBasicMaterial({ vertexColors:THREE.VertexColors, side:THREE.DoubleSide }); 

    triangleMesh = new THREE.Mesh( triangleGeometry, triangleMaterial ); 
    triangleMesh.position.set(-1.5, 0.0, 4.0 ); 

    triangleMesh.position.z     -=  5;
    triangleMesh.rotation.z     +=  angle * Math.PI / 180; // angle is from outer for loop

    parent.add( triangleMesh );

我需要围绕一个边缘旋转它来构建棱镜/六边形。

【问题讨论】:

  • 您能否说明一下您的意思是 “我需要围绕一个边缘旋转它来构建棱镜/六边形。”
  • 当三角形在屏幕上时,你可以看到它的整个平面,一个边向上,我想把三角形旋转60度,比如说顺时针旋转60度,围绕这个上边,把它进入父对象,所以我可以旋转下一个三角形,围绕其上边缘旋转 120 度,依此类推,直到六边形在 6 次运行后存在(因此每个图块 60 度)。
  • 我想,你的意思是你想围绕它的顶部顶点旋转那个三角形[0.0, 1.0, 0.0]?如果不是,那么最好显示所需结果的解释性图片。

标签: javascript object three.js rotation


【解决方案1】:

要围绕其中一个角旋转三角形,该角必须位于坐标中心。为此,您可以使用THREE.Geometry().translate ( x, y, z ) 方法。

看一下代码sn-p。

var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 1000);
camera.position.set(0, 0, 5);
var renderer = new THREE.WebGLRenderer({
  antialias: true
});
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

var ngon = 11;
var radius = 2;
var angle = Math.PI / ngon;
var triHeight = Math.cos(angle) * radius;
var triWidth = Math.sin(angle) * radius;

var triangleMesh;
var triangleGeometry = new THREE.Geometry();
triangleGeometry.vertices.push(new THREE.Vector3(0.0, triHeight, 0.0));
triangleGeometry.vertices.push(new THREE.Vector3(-triWidth, 0, 0.0));
triangleGeometry.vertices.push(new THREE.Vector3(triWidth, 0, 0.0));

triangleGeometry.faces.push(new THREE.Face3(0, 1, 2));

triangleGeometry.faces[0].vertexColors[0] = new THREE.Color(0xFF0000);
triangleGeometry.faces[0].vertexColors[1] = new THREE.Color(0x00FF00);
triangleGeometry.faces[0].vertexColors[2] = new THREE.Color(0x0000FF);

triangleGeometry.translate(0, -triHeight, 0); // the upper vertex is at the center  now

var triangleMaterial = new THREE.MeshBasicMaterial({
  vertexColors: THREE.VertexColors,
  side: THREE.DoubleSide
});

triangleMesh = new THREE.Mesh(triangleGeometry, triangleMaterial);

for (var i = 1; i < ngon; i++) {
  var newTri = triangleMesh.clone();
  newTri.rotation.z = i * angle * 2;
  scene.add(newTri);
}

scene.add(triangleMesh);

render();

function render() {
  requestAnimationFrame(render);
  renderer.render(scene, camera);
}
body {
  overflow: hidden;
  margin: 0;
}
&lt;script src="https://threejs.org/build/three.min.js"&gt;&lt;/script&gt;

【讨论】:

    猜你喜欢
    • 2021-05-04
    • 2016-07-30
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 2014-02-08
    • 2012-04-08
    相关资源
    最近更新 更多