javascript - 在 Three.js 中旋转立方体纹理

标签 javascript three.js textures skybox

我在 Three.js 中得到了这个立方体纹理。假设我想将立方体纹理本身旋转 180 度。我知道我可以通过旋转相机来做到这一点,但我想旋转纹理本身而不是相机。我怎样才能实现这个目标?

我想旋转立方体纹理的 x 轴,使其显示相反的一侧。像 texture.flipX = true; 这样的东西会很方便。

https://codepen.io/haangglide/pen/GRZPqaw

var camera, scene, box, renderer;

init();
animate();

function init() {

    renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    scene = new THREE.Scene();

    const texture = new THREE.CubeTextureLoader()
        .setCrossOrigin('')     .setPath('https://alca.tv/static/codepen/pens/common/SwedishRoyalCastle/').load(['px.jpg', 'nx.jpg', 'py.jpg', 'ny.jpg', 'pz.jpg', 'nz.jpg']);
    
    scene.background = texture;

    const geometry = new THREE.BoxGeometry(1, 1, 1);
    const material = new THREE.MeshBasicMaterial({ color: new THREE.Color('skyblue') });
    box = new THREE.Mesh(geometry, material);
    scene.add(box);
    
    camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
    camera.position.z = 5;
    scene.add(camera);
    document.body.appendChild(renderer.domElement);
}

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

最佳答案

编辑:

根据以下讨论,使用 ThreeJS 完成您所要求的操作似乎并不容易,甚至不可能,但在第一个链接中确实提到使用 BabylonJS 可能是可行的。

https://discourse.threejs.org/t/rotate-a-scenes-background-skybox-texture/12199 https://discourse.threejs.o9rg/t/rotate-a-scenes-background/3928/15

原始答案:

你没有说哪个轴,所以我只使用 Y 轴。我还使用 45 度而不是 180 度,这样您就可以看到它正在工作。

var camera, scene, box, renderer;

init();
animate();

function init() {

    renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    scene = new THREE.Scene();

    const texture = new THREE.CubeTextureLoader()
        .setCrossOrigin('')     .setPath('https://alca.tv/static/codepen/pens/common/SwedishRoyalCastle/').load(['px.jpg', 'nx.jpg', 'py.jpg', 'ny.jpg', 'pz.jpg', 'nz.jpg']);
    
    scene.background = texture;
    
    const geometry = new THREE.BoxGeometry(1, 1, 1);
    const material = new THREE.MeshBasicMaterial({ color: new THREE.Color('skyblue') });
    box = new THREE.Mesh(geometry, material);
    
    ///
    ///
    ///
    ///////////////////////////////
    //since threejs uses radians, you will need a function to get radians from degrees
    function getRadians(degrees) {
      return Math.PI / 180 * degrees;
    }
    
    //using rotation.set(x, y, z)
    box.rotation.set(0, getRadians(45), 0);
    
    //directly setting the rotations
    box.rotation.y = getRadians(45);
    ///////////////////////////////
    ///
    ///
    ///
    
    scene.add(box);
    
    camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
    camera.position.z = 5;
    scene.add(camera);
    document.body.appendChild(renderer.domElement);
}

function animate() {
    requestAnimationFrame(animate);
    renderer.render(scene, camera);
}
<script src="https://threejs.org/build/three.js"></script>

关于javascript - 在 Three.js 中旋转立方体纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64013590/

相关文章:

javascript - 如何动态/响应式更改 jQuery 日期选择器的月数

javascript - 如何在具有范围的集合之间快速分配值

javascript - obj 文件中的 Threejs UV 映射

javascript - 在 THREEjs 中对对象的大小进行动画处理

opengl - 如何写入 OpenGL 深度缓冲区

javascript - CKEditor 5 粘贴为纯文本

javascript - Three.js 抗锯齿不适用于 Chrome

c# - 如何在 Unity 中使用粗糙度纹理?

c++ - OpenGL Vertex Buffer Object 代码输出错误

javascript - 如果用户刷新页面,是否可以维护 jquery 事件显示的内容?