![](/img/trans.png)
[英]index.html:601 Uncaught TypeError: Cannot read property 'map' of undefined at showTable (index.html:601) at onload (index.html:614)
[英]Uncaught TypeError: Cannot read property 'rotation' of undefined at animate (index.html:266) at index.html:287
我的代碼運行並顯示它需要什么,但是當我嘗試使用旋轉或位置為 model 設置動畫時出現此錯誤。 我曾嘗試使用 init function 來運行其中的所有內容,但仍然無法正常工作。 一旦我停止在動畫 function 中為 model 設置動畫,錯誤就會消失,但是 model 不再旋轉。
let model;
let mixer;
let model2;
let mixer2;
let mixer3, mixer4, mixer5, mixer6;
let planet;
//BUTTON
//let startButton = document.getElementById("startButton");
//if(startButton){
//startButton.addEventListener("click");
//s }
//SOUND INPUT TONE.JS
const player = new Tone.Player("sound/whale.wav").toDestination();
// play as soon as the buffer is loaded
player.loop = true;
player.volume.value = -15;
player.autostart = true;
const player2 = new Tone.Player("sound/space.wav").toDestination();
// play as soon as the buffer is loaded
player2.loop = true;
player2.autostart = true;
//sfunction init (){
const MODEL_PATH = "model/stacy.gltf";
clock = new THREE.Clock();
//CREATE SCENE AND CAMERA
const scene = new THREE.Scene();
const backgroundColor = 0x000000;
scene.background = new THREE.Color(backgroundColor);
const camera = new THREE.PerspectiveCamera(
70,
window.innerWidth / window.innerHeight,
0.01,
100
);
camera.position.y = 40;
//CREATE RENDERER
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
camera.position.z = 50;
camera.position.y = 40;
var loader = new THREE.GLTFLoader().setPath("model/car/");
loader.load("scene.gltf", function (gltf) {
mixer = new THREE.AnimationMixer(gltf.scene);
var action = mixer.clipAction(gltf.animations[0]);
action.play();
scene.add(gltf.scene);
gltf.scene.position.x += 0.2;
gltf.scene.rotation.y = -1.3;
gltf.scene.scale.set(2, 2, 2);
gltf.scene.position.set(15, -15, 40);
model2 = gltf.scene;
});
var loader = new THREE.GLTFLoader().setPath("model/statue/");
loader.load("scene.gltf", function (gltf) {
mixer3 = new THREE.AnimationMixer(gltf.scene);
var action = mixer3.clipAction(gltf.animations[0]);
action.play();
scene.add(gltf.scene);
//gltf.scene.rotation.y =-1.3;
gltf.scene.scale.set(6, 6, 6);
gltf.scene.position.set(0, -70, -45);
});
var loader = new THREE.GLTFLoader().setPath("model/robot/");
loader.load("scene.gltf", function (gltf) {
mixer5 = new THREE.AnimationMixer(gltf.scene);
var action = mixer5.clipAction(gltf.animations[0]);
action.play();
scene.add(gltf.scene);
gltf.scene.rotation.x = -1.3;
gltf.scene.rotation.z = -1.3;
gltf.scene.scale.set(4, 4, 4);
gltf.scene.position.set(-5, -55, 25);
});
var loader = new THREE.GLTFLoader().setPath("model/blackhole/");
loader.load("scene.gltf", function (gltf) {
mixer4 = new THREE.AnimationMixer(gltf.scene);
var action = mixer4.clipAction(gltf.animations[0]);
action.play();
scene.add(gltf.scene);
gltf.scene.rotation.x = -1.7;
gltf.scene.scale.set(0.5, 0.5, 0.5);
gltf.scene.position.set(0, -70, -30);
});
var loader = new THREE.GLTFLoader().setPath("model/galaxy/");
loader.load("scene.gltf", function (gltf) {
scene.add(gltf.scene);
gltf.scene.scale.set(0.5, 0.5, 0.5);
gltf.scene.position.set(10, -100, 30);
planet = gltf.scene;
});
//STARS
let starGeo, stars;
starGeo = new THREE.Geometry();
for (let i = 0; i < 6000; i++) {
let star = new THREE.Vector3(
Math.random() * 600 - 300,
Math.random() * 600 - 300,
Math.random() * 600 - 300
);
starGeo.vertices.push(star);
}
let sprite = new THREE.TextureLoader().load("img/star.png");
let starMaterial = new THREE.PointsMaterial({
color: 0xffffff,
size: 0.7,
map: sprite,
});
stars = new THREE.Points(starGeo, starMaterial);
scene.add(stars);
//LIGHTS
const pointLight = new THREE.PointLight(0xff3f0f, 15, 100);
pointLight.position.set(0, -100, 0);
scene.add(pointLight);
const sphereSize = 3;
const pointLightHelper = new THREE.PointLightHelper(pointLight, sphereSize);
scene.add(pointLightHelper);
const pointLight2 = new THREE.PointLight(0xff3f0f, 15, 100);
pointLight2.position.set(0, -50, 0);
scene.add(pointLight2);
const sphereSize2 = 3;
const pointLightHelper2 = new THREE.PointLightHelper(pointLight2, sphereSize2);
scene.add(pointLightHelper2);
//onWINDOWRESIZE FUNCTION
function onWindowResize() {
//resize & align
sceneHeight = window.innerHeight;
sceneWidth = window.innerWidth;
renderer.setSize(sceneWidth, sceneHeight);
camera.aspect = sceneWidth / sceneHeight;
camera.updateProjectionMatrix();
}
// ANIMATE FUNCTION
function animate() {
requestAnimationFrame(animate);
var t = scrollY / (5000 - innerHeight);
// t is 0 to 1
camera.position.y = 0.01 - (800 * t) / 80;
stars.rotation.y += 0.0005;
planet.rotation.y += 0.005;
var delta = clock.getDelta();
if (mixer) mixer.update(delta / 2);
if (mixer2) mixer2.update(delta);
if (mixer3) mixer3.update(delta / 10);
if (mixer4) mixer4.update(delta / 10);
if (mixer5) mixer5.update(delta / 4);
if (mixer6) mixer6.update(delta / 0.1);
renderer.render(scene, camera);
}
animate();
問題可能與planet
有關。 您正試圖在 animation 循環內訪問其rotation
屬性。 這可以!
但是,您正在加載程序回調中分配planet
。 這也不錯!
但是,加載器是異步的,可能需要一些時間。 您的 animation 循環立即開始。
因此,當加載程序嘗試下載並打開您的 GLTF 文件時,animation 循環嘗試渲染場景。 因為planet
尚未分配,所以它的值是undefined
。 undefined
顯然沒有rotation
屬性,所以你得到一個錯誤。
解決此問題的最簡單方法是簡單地將 animation 循環的那一部分包裝在檢查中以確保分配了變量。
if( planet ){
planet.rotation.y += 0.005;
}
這將確保您不會嘗試更新不存在的值的屬性。
或者,您可以將planet
創建為THREE.Group
,然后將gltf.scene
添加到加載程序回調中的適當組。
let planet = new THREE.Group();
scene.add(planet);
loader.load(path, function( gltf ){
//...
planet.add( gltf.scene );
//...
});
這也避免了錯誤,因為planet
變量被初始化為THREE.Group
,它具有rotation
屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.