立方体无法在 three.js 内沿 Y 轴完全旋转
Cube cannot do a full rotation on the Y axis in three.js
我有一个低多边形世界,我为我的角色添加了带有光线投射的“重力”。现在我需要在角色前面添加另一个光线投射器(在本例中是指针锁定控件)指向前方(始终在相机前面并面向同一方向)让我的角色能够在非平面上行走表面。
照片中'b'是光线投射器。然后我会用三角函数来计算坡度,以便知道是否可以步行到那里,如果可以,那么我就使用偏移量; 'a' 以及从角色到称为 'b' 的交叉点的距离,以在其局部 Y 轴和 Z 轴上平移相机。
所以我开始测试并想出了这个:
#blocker {
position: absolute;
width: 100%;
height: 100%;
background-color: rgba(0,0,0,0.5);
}
#instructions {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
font-size: 14px;
cursor: pointer;
}
<div id="blocker">
<div id="instructions">
<p style="font-size:36px">
Click to play
</p>
</div>
</div>
<script type="module">
import * as THREE from "https://cdn.skypack.dev/three@0.135.0";
import {PointerLockControls} from "https://cdn.skypack.dev/three@0.135.0/examples/jsm/controls/PointerLockControls";
let scene = new THREE.Scene();
let camera = new THREE.PerspectiveCamera(60, innerWidth / innerHeight, 1, 1000);
camera.position.set(0, 8, 13);
let renderer = new THREE.WebGLRenderer({antialias: true});
renderer.setSize(innerWidth, innerHeight);
renderer.setClearColor(0x404040);
document.body.appendChild(renderer.domElement);
window.addEventListener("resize", () => {
camera.aspect = innerWidth / innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(innerWidth, innerHeight);
})
const controls = new PointerLockControls( camera, document.body );
const blocker = document.getElementById( 'blocker' );
const instructions = document.getElementById( 'instructions' );
instructions.addEventListener( 'click', function () {
controls.lock();
} );
controls.addEventListener( 'lock', function () {
instructions.style.display = 'none';
blocker.style.display = 'none';
} );
controls.addEventListener( 'unlock', function () {
blocker.style.display = 'block';
instructions.style.display = '';
} );
scene.add( controls.getObject() );
const geometry = new THREE.BoxGeometry( 1, 1, 1 );
const material = new THREE.MeshBasicMaterial( {color: 0x00ff00} );
let cube = new THREE.Mesh( geometry, material );
scene.add( cube );
function animate(){
renderer.render(scene,camera)
cube.position.copy(controls.getObject().position)
cube.rotation.y = controls.getObject().rotation.y
cube.translateZ(-10)
}
animate();
</script>
我不知道为什么 Pointer Lock 不能使用片段...我可能做错了什么但我找不到 Fiddle 或 Codepen 所以这里有一个视频显示显然 the issue。如您所见,立方体不能进行完整的旋转,它在一侧工作得很好,但当我转向另一侧时,立方体就会朝另一个方向移动。与这个问题相关的代码主要是这3行:
cube.position.copy(controls.getObject().position)
cube.rotation.y = controls.getObject().rotation.y
cube.translateZ(-10)
解决方案:当我将角度应用于基于弧度的网格旋转时,我必须将角度转换为弧度。
我有一个低多边形世界,我为我的角色添加了带有光线投射的“重力”。现在我需要在角色前面添加另一个光线投射器(在本例中是指针锁定控件)指向前方(始终在相机前面并面向同一方向)让我的角色能够在非平面上行走表面。
照片中'b'是光线投射器。然后我会用三角函数来计算坡度,以便知道是否可以步行到那里,如果可以,那么我就使用偏移量; 'a' 以及从角色到称为 'b' 的交叉点的距离,以在其局部 Y 轴和 Z 轴上平移相机。
所以我开始测试并想出了这个:
#blocker {
position: absolute;
width: 100%;
height: 100%;
background-color: rgba(0,0,0,0.5);
}
#instructions {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
font-size: 14px;
cursor: pointer;
}
<div id="blocker">
<div id="instructions">
<p style="font-size:36px">
Click to play
</p>
</div>
</div>
<script type="module">
import * as THREE from "https://cdn.skypack.dev/three@0.135.0";
import {PointerLockControls} from "https://cdn.skypack.dev/three@0.135.0/examples/jsm/controls/PointerLockControls";
let scene = new THREE.Scene();
let camera = new THREE.PerspectiveCamera(60, innerWidth / innerHeight, 1, 1000);
camera.position.set(0, 8, 13);
let renderer = new THREE.WebGLRenderer({antialias: true});
renderer.setSize(innerWidth, innerHeight);
renderer.setClearColor(0x404040);
document.body.appendChild(renderer.domElement);
window.addEventListener("resize", () => {
camera.aspect = innerWidth / innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(innerWidth, innerHeight);
})
const controls = new PointerLockControls( camera, document.body );
const blocker = document.getElementById( 'blocker' );
const instructions = document.getElementById( 'instructions' );
instructions.addEventListener( 'click', function () {
controls.lock();
} );
controls.addEventListener( 'lock', function () {
instructions.style.display = 'none';
blocker.style.display = 'none';
} );
controls.addEventListener( 'unlock', function () {
blocker.style.display = 'block';
instructions.style.display = '';
} );
scene.add( controls.getObject() );
const geometry = new THREE.BoxGeometry( 1, 1, 1 );
const material = new THREE.MeshBasicMaterial( {color: 0x00ff00} );
let cube = new THREE.Mesh( geometry, material );
scene.add( cube );
function animate(){
renderer.render(scene,camera)
cube.position.copy(controls.getObject().position)
cube.rotation.y = controls.getObject().rotation.y
cube.translateZ(-10)
}
animate();
</script>
我不知道为什么 Pointer Lock 不能使用片段...我可能做错了什么但我找不到 Fiddle 或 Codepen 所以这里有一个视频显示显然 the issue。如您所见,立方体不能进行完整的旋转,它在一侧工作得很好,但当我转向另一侧时,立方体就会朝另一个方向移动。与这个问题相关的代码主要是这3行:
cube.position.copy(controls.getObject().position)
cube.rotation.y = controls.getObject().rotation.y
cube.translateZ(-10)
解决方案:当我将角度应用于基于弧度的网格旋转时,我必须将角度转换为弧度。