gpt4 book ai didi

javascript - Three.js:如何添加垂直于面(法线)的对象?

转载 作者:行者123 更新时间:2023-12-03 03:25:51 29 4
gpt4 key购买 nike

我正在尝试添加一个垂直于我单击的面的框(称为“标记”)。

为此,单击时,我会转换一条射线,如果它击中某些物体,我会获取法线的交点值并将它们传输到“标记”作为其旋转值。在问这个问题之前,我阅读了这个答案( How do I make an object perpendicular to a face with Three.js? )但无法使其工作......

目前,它在需要的地方添加了标记,但方向略有错误,预计在立方体的顶部。

Wrong orientation on cube and uncontroled Y rotation

我不明白两件事: 1. 为什么faceNormalsHelper的方向和intersects[0].face.normal之间存在差异。 2、Y轴旋转是如何控制的?

我的错误是什么?为了帮助您帮助我,我制作了一个 fiddle ( https://jsfiddle.net/jpyncf62/1/ ),这是我用来执行此操作的代码:

function clickDown(e) {
e.preventDefault();

raycaster.setFromCamera(mouse, camera);
var intersects = raycaster.intersectObjects(objects);

if (intersects.length > 0) {
var intersect = intersects[0];
console.log(intersects[0]);
console.log(console.log(intersects[0].object.name));

var markerGeo = new THREE.BoxGeometry(1, 6, 1, 1, 1, 1);
var markerMat = new THREE.MeshLambertMaterial({ color: 0xff0000 });
var marker = new THREE.Mesh(markerGeo, markerMat);
marker.name = "marker";
marker.position.copy(intersect.point);

marker.lookAt(intersect.face.normal);

scene.add(marker);
}
}

谢谢你的帮助!

最佳答案

您正在添加立方体和平面。并给他们位置和旋转。但为了正确地相交它们的法线,您应该应用矩阵。

    var container, stats;
var camera, scene, renderer;
var objects = [];
raycaster = new THREE.Raycaster();
mouse = new THREE.Vector2();

init();
animate();

function init() {
container = document.getElementById("webgl-output")
scene = new THREE.Scene();

camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 1000 );
camera.position.set(20, 50,50);
camera.lookAt( scene.position );

scene.add ( new THREE.AmbientLight( 0xffffff ) );

light = new THREE.DirectionalLight( 0xffffff );
light.position.set( 0, 1, 0 );
scene.add( light );

var material = new THREE.MeshLambertMaterial( { color: 0x4fc2c9 } );
var cube = new THREE.Mesh( new THREE.BoxGeometry( 10, 10, 10, 1, 1, 1 ), material );
cube.name = "I'm a cube";
objects.push( cube );
scene.add( cube );


cube.position.set( 0, 5, 0 );
cube.rotation.set( 0, 0, Math.PI / 4);

applyMatrixOfMesh(cube); // Apply matrix of cube

// Add helpers after applied matrix
var faceNormalsHelper = new THREE.FaceNormalsHelper( cube, 1 );
cube.add( faceNormalsHelper );

var vertexNormalsHelper = new THREE.VertexNormalsHelper( cube, 1 );
cube.add( vertexNormalsHelper );

var planeGeo = new THREE.PlaneGeometry( 60, 20, 1, 1 );
var planeMat = new THREE.MeshLambertMaterial({ color: 0xffffff });
var plane = new THREE.Mesh( planeGeo, planeMat );
plane.position.set(0, 0, 0);
plane.rotation.x = -0.5 * Math.PI;
plane.name = "plane01";

applyMatrixOfMesh(plane); // Apply matrix of plane

scene.add( plane );
objects.push( plane );

var axes = new THREE.AxisHelper( 20 );
scene.add( axes );

renderer = new THREE.WebGLRenderer( { antialias: true });
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setClearColor( 0xeeeeee );
renderer.setSize( window.innerWidth, window.innerHeight );
container.appendChild( renderer.domElement );

document.addEventListener('mousemove', mouseMoving, false);
document.addEventListener('mousedown', clickDown, false);
}

function mouseMoving(e) {
mouse.x = ( e.clientX / window.innerWidth ) * 2 - 1;
mouse.y = - ( e.clientY / window.innerHeight ) * 2 + 1;
raycaster.setFromCamera( mouse, camera );

var intersects = raycaster.intersectObjects( scene.children );

for ( var i = 0; i < intersects.length; i++ ) {
var posY = intersects[ 0 ].point.y.toFixed(2);
}
}

function clickDown(e) {
e.preventDefault();

raycaster.setFromCamera( mouse, camera );
var intersects = raycaster.intersectObjects( objects );

if( intersects.length > 0 ) {
var intersect = intersects[ 0 ];
console.log( intersects[ 0 ]);
console.log( console.log( intersects[ 0 ].face.normal ) );

var markerGeo = new THREE.BoxGeometry( 1, 1, 6, 1, 1, 1 ); // I changed BoxGeometry
var markerMat = new THREE.MeshLambertMaterial( { color: 0xff0000 } );
var marker = new THREE.Mesh( markerGeo, markerMat );
marker.name = "marker";



marker.lookAt( intersect.face.normal ); // First look At to normal
marker.position.copy( intersect.point ) // After give position to marker

scene.add( marker );
}
}

function applyMatrixOfMesh(mesh) { // You should apply Matrix of cube and plane
mesh.updateMatrix();
mesh.geometry.applyMatrix(mesh.matrix);

mesh.position.set(0, 0, 0);
mesh.rotation.set(0, 0, 0);
mesh.updateMatrix();
}


function animate() {
requestAnimationFrame( animate );
render();
}

function render() {
renderer.render( scene, camera );
}

代码中有一个名为“applyMatrixOfMesh”的函数。您需要将它用于用于相交的每个“THREE.Mesh”。

关于javascript - Three.js:如何添加垂直于面(法线)的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46336560/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com