javascript - Three.js:为什么没有和 OrbitControls 3d 模型不显示?; 是否可以进行自动模型尺寸调整
问题描述
我正在尝试用three.js(我是新手)做一个3d模型查看器,但我遇到了一些困难:
模型显示正确,但我尝试使用 OrbitControls 进行启用(或不启用)鼠标控制的设置。问题是,如果我删除 line
controls = new THREE.OrbitControls(camera, renderer.domElement)
,模型将不再显示。为什么 ?我该如何解决?根据模型的大小,有时它会显示得非常小,或者太大而无法在屏幕上看到。我可以手动更改相机位置或对象比例来解决这个问题,但是有没有办法自动做到这一点?目标是让客户在那里导入自己的模型,所以我们不能让它们自己重新缩放。
非常感谢您的帮助,这是我的 main.js :
let camera, scene, renderer, object, animations, mixer, action, pmremGenerator, controls
let mouseControls, ground, background
init();
animate();
function init() {
// SCENE
scene = new THREE.Scene();
scene.background = new THREE.Color(0xf0f0f0);
// CLOCK
clock = new THREE.Clock();
// CAMERA
camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight);
camera.position.set(-10, 0, 0);
// LIGHT
const light = new THREE.AmbientLight(0xffffff);
scene.add(light);
// RENDERER
const container = document.createElement('div');
document.body.appendChild(container);
renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.toneMapping = THREE.ACESFilmicToneMapping;
renderer.toneMappingExposure = 1;
renderer.outputEncoding = THREE.sRGBEncoding;
container.appendChild(renderer.domElement);
pmremGenerator = new THREE.PMREMGenerator(renderer);
pmremGenerator.compileEquirectangularShader();
// LOADER
modelLoader('phone')
// RESIZE
window.addEventListener('resize', onWindowResize);
// SETTINGS
// GROUND
ground = false
// BACKGROUND
background = true
// CONTROLS
controls = new THREE.OrbitControls(camera, renderer.domElement);
mouseControls = true
}
function render() {
if (camera) {
renderer.render(scene, camera);
}
}
function animate() {
requestAnimationFrame(animate);
renderer.render(scene, camera);
}
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
render();
}
function modelLoader(folder) {
const loader = new THREE.GLTFLoader()
loader.load(folder + '/scene.gltf', function(gltf) {
object = gltf.scene
object.scale.set(0.4, 0.4, 0.4)
object.position.set(0, 0, 0)
object.rotation.set(0, 0, 0)
scene.add(gltf.scene);
render();
// ANIMATION
animations = gltf.animations
if (animations) {
setAnimations()
}
});
}
function setAnimations() {
mixer = new THREE.AnimationMixer(object);
animations.forEach((clip) => {
action = mixer.clipAction(clip)
action.setLoop(THREE.LoopPingPong, 9999)
action.play()
})
}
function setGround() {
const geometry = new THREE.PlaneGeometry(500, 500);
const material = new THREE.MeshPhongMaterial({ color: 0x999999, depthWrite: false });
const ground = new THREE.Mesh(geometry, material);
ground.position.set(0, -5, 0);
ground.rotation.x = -Math.PI / 2;
ground.receiveShadow = true;
scene.add(ground);
const grid = new THREE.GridHelper(500, 100, 0x000000, 0x000000);
grid.position.y = -5;
grid.material.opacity = 0.2;
grid.material.transparent = true;
scene.add(grid);
}
function setBackground() {
new THREE.RGBELoader().load('venice_sunset_1k.hdr', function(texture) {
const envMap = pmremGenerator.fromEquirectangular(texture).texture;
scene.background = envMap;
scene.environment = envMap;
texture.dispose();
pmremGenerator.dispose();
render();
})
}
function setMouseControls() {
controls.addEventListener('change', render); // use if there is no animation loop
controls.minDistance = 2;
controls.maxDistance = 100;
controls.target.set(0, 0, 0);
controls.update();
}
// SETTINGS
if (ground == true) setGround()
if (background == true) setBackground()
if (mouseControls == true) setMouseControls()
解决方案
推荐阅读
- python - Python 抛出 AttributeError:'Group' 对象没有属性 'blitme'
- python - 解决 Python 之谜
- symfony - Symfony 自动装配事件监听器
- java - 为什么我不能在 j_spring_security_check 页面上创建“链接”?
- django - 用聚合连接 DJANGO 中的两个表
- c# - 关于单元测试的问题
- reactjs - socket.io 反应 heroku 405
- python - 在Python中将具有重复键的嵌套JSON文件转换为数据框
- javascript - 加载/卸载 HTML5 时还存在 iOS Safari 内存泄漏
- swift - Swift DispatchQueue concurrentPerform OpenGL 并行渲染