javascript - 三个JS中这段代码片段的含义

标签 javascript three.js transformation coordinate-transformation normals

由于我是 3D 世界和三个 JS 世界的新手,所以我了解大部分内容,但在涉及矩阵时总是感到困惑。

我想做的是,我想将一个小对象拖到其他对象之上,并且小对象应该面向主要对象的相同方向(一个例子就像在墙上挂一个挂钟)。

为此,我首先尝试在旋转立方体的顶部放置一个轴助手,并应用简单的逻辑,一个相交点将给出放置小物体的位置,相交的物体面法线将为小物体提供方向 lookAt .我做了并发现成功但不合适。

然后我做了一些计算并搜索了一些代码来计算相同的东西,我现在成功了。但不理解背后的整个逻辑,为什么我们这样做。

this.normalMatrix.getNormalMatrix(intersects[i].object.matrixWorld);
this.worldNormal.copy(intersects[i].face.normal).applyMatrix3(this.normalMatrix).normalize();
this.object.position.addVectors(intersects[i].point, this.worldNormal);
this.lookAtVec.addVectors(this.object.position,this.worldNormal.multiplyScalar(15));
this.object.lookAt(this.lookAtVec);

一个人实际上创造了一堵墙,并在上面放了一个小物体。他改变了这一行

this.object.position.addVectors(intersects[i].point, this.worldNormal);

this.object.position.copy(intersects[i].point);

这对他有用,但同样的事情对我的轴助手不起作用。

最佳答案

只是你如何做的一个选择。查看 onMouseMove() 函数的结尾:

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

var controls = new THREE.OrbitControls(camera, renderer.domElement);

var light = new THREE.DirectionalLight(0xffffff, 0.5);
light.position.setScalar(10);
scene.add(light);
scene.add(new THREE.AmbientLight(0xffffff, 0.5));

var walls = [];

makeWall(Math.PI * 0.5);
makeWall(0);
makeWall(Math.PI * -0.5);

var clockGeom = new THREE.BoxBufferGeometry(1, 1, 0.1);
clockGeom.translate(0, 0, 0.05);
var clockMat = new THREE.MeshBasicMaterial({
  color: "orange"
});
var clock = new THREE.Mesh(clockGeom, clockMat);
scene.add(clock);

var raycaster = new THREE.Raycaster();
var mouse = new THREE.Vector2();
var intersects = [];
var lookAt = new THREE.Vector3();

renderer.domElement.addEventListener("mousemove", onMouseMove, false);

function onMouseMove(event) {

  mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
  mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;

  raycaster.setFromCamera(mouse, camera);

  intersects = raycaster.intersectObjects(walls);
  if (intersects.length === 0) return;

  clock.position.copy(intersects[0].point);
  clock.lookAt(lookAt.copy(intersects[0].point).add(intersects[0].face.normal));
}

render();

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

function makeWall(rotY, color) {
  let geom = new THREE.BoxBufferGeometry(8, 8, 0.1);
  geom.translate(0, 0, -4);
  geom.rotateY(rotY);
  let mat = new THREE.MeshLambertMaterial({
    color: Math.random() * 0x777777 + 0x777777
  });
  let wall = new THREE.Mesh(geom, mat);
  scene.add(wall);
  walls.push(wall);
}
body {
  overflow: hidden;
  margin: 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/94/three.min.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>

关于javascript - 三个JS中这段代码片段的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51230611/

相关文章:

three.js - 如何在 THREE.PointCloudMaterial 中使用大小?

javascript - 标准全屏四重设置在 Three.js 中不起作用

opencv - 在 Opencv 中仅使用平移、旋转和缩放计算单应性

java - 骡子 ESB : xml to maps transformer produces empty hashmaps

javascript - "Math.random() * arr.length | 0"如何返回数组的随机索引

javascript - 嵌套 getElementById 抛出错误?

javascript - 获取错误代码 : 0 in only IE for javascript file

javascript - Angular ng-class 在 ng-change 被触发后不更新

javascript - 三个JS boxGeometry,渲染警告: Render count or primcount is 0

sas - 如何将列的值移动为新变量名?