Three.js: 如何翻转轴使 Z 轴变为 X 轴

Three.js: How to flip the axis so Z-axis become X-axis

我正在使用 three.js 在 3D 立方体上可视化加速度计数据。

我的加速度计收集数据,其中 X 轴是指物体向上和向下移动的时间,Z 轴是指物体向右和向左移动的时间。 在 three.js 中,当我使用启用 axis.helper() 时,它使用标准轴,例如 Z 到顶部,X 左右,Y 上下。

我想让坐标轴像下图那样翻转:

这是我用于可视化的 javascript 代码:

import * as THREE from "three";
import data from "../data/data.json"
import "./style.css"

var width = window.innerWidth;
var height = window.innerHeight;
const canvas = document.querySelector('#canvas');
const renderer = new THREE.WebGLRenderer({ canvas });
renderer.setSize (width, height);

var planeSize = 100000
const fov = 70;
const aspect = 2;  // the canvas default
const near = 20;
const far = 500;

const camera = new THREE.PerspectiveCamera(70, width/height, 1, 10000);

camera.position.x = 100;
camera.position.y = 50;
camera.position.z = 50;

camera.lookAt (new THREE.Vector3(0,0,0));

const scene = new THREE.Scene();
{
    const color = 0x00afaf;
    const intensity = 10;
    const size = 10;
    const divisions = 10;

    const gridHelper = new THREE.GridHelper( planeSize, 5000 );
    gridHelper.setColors( new THREE.Color(0xff0000), new THREE.Color(0xffffff) );
    scene.add(gridHelper);
    
    const light = new THREE.PointLight(color, intensity);
    scene.add(light);
}

const boxGeometry = new THREE.BoxGeometry();
const boxMaterial = new THREE.MeshBasicMaterial({ color: "green", wireframe: false });
const object = new THREE.Mesh(boxGeometry, boxMaterial);

var cubeAxis = new THREE.AxesHelper(4);
object.add(cubeAxis);

object.scale.set(5, 5, 5)
scene.add(object);
scene.background = new THREE.Color(0.22, 0.23, 0.22);

let currentIndex = 0
let time = data[currentIndex].time
let velocity = new THREE.Vector3()
requestAnimationFrame(render);

function render(dt) {
    dt *= 0.00001 // in seconds
    time += dt
    document.querySelector("#time").textContent = time.toFixed(2)

    // Find datapoint matching current time
    while (data[currentIndex].time < time) {
        currentIndex++
        if (currentIndex >= data.length) return
    }
    const {accX } = data[currentIndex]

    document.querySelector("#accZ").textContent = accZ* 10;
    const acceleration = new THREE.Vector3()
    // object.rotation.set( rotX, rotY, rotZ)
    object.position.z = accZ; 

    var relativeCameraOffset = new THREE.Vector3 (0,20,0);
    var cameraOffset = relativeCameraOffset.applyMatrix4( object.matrixWorld );
    camera.position.x = cameraOffset.x;
    camera.position.y = cameraOffset.y;
    camera.position.z = cameraOffset.z;
    camera.lookAt( object.position );

    resizeToClient();
    renderer.render(scene, camera);
    requestAnimationFrame(render);
}

function resizeToClient() {
    const needResize = resizeRendererToDisplaySize()
    if (needResize) {
        const canvas = renderer.domElement;
        camera.aspect = canvas.clientWidth / canvas.clientHeight;
        camera.updateProjectionMatrix();
    }
}

function resizeRendererToDisplaySize() {
    const canvas = renderer.domElement;
    const width = canvas.clientWidth;
    const height = canvas.clientHeight;
    const needResize = canvas.width !== width || canvas.height !== height;
    if (needResize) {
        renderer.setSize(width, height, false);
    }
    return needResize;
}

你不需要改变three.js的坐标轴。只需更改加速度计数据的输入即可。

而不是position.set(accX, accY, accZ);

改为position.set(accZ, accY, accX);

或者任何适合您情况的顺序。您发布的第一张图片不是 WebGL 轴的建立方式,因此您将不得不稍微调整一下顺序以获得所需的结果。