【发布时间】:2022-01-19 17:48:30
【问题描述】:
我试图访问这个数组中的元素,但由于某种原因,它说“未定义”并返回长度为 0,但显然长度为 5。上图是这段代码的结果。
console.log(scene.children[1].children);
下面这段代码的结果是0
console.log(scene.children[1].children.length);
下面这段代码的结果是undefined
console.log(scene.children[1].children[0]);
如果对上下文有帮助,这里是以前的路径:
console.log(scene);
console.log(scene.children[1]);
每 cmets:这里是完整代码:
import "./styles.css";
import * as THREE from "three";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
import gsap from "gsap";
import blueHouseBaked from "./static/Bluehouse.png";
import blueHouse from "./static/Bluehouse.glb";
import greenHouseBaked from "./static/Greenhouse.png";
import greenHouse from "./static/Greenhouse.glb";
import redHouseBaked from "./static/Redhouse.png";
import redHouse from "./static/Redhouse.glb";
import purpleHouseBaked from "./static/Purplehouse.png";
import purpleHouse from "./static/Purplehouse.glb";
import groundBaked from "./static/Ground.png";
import ground from "./static/Ground.glb";
import "regenerator-runtime/runtime";
const canvas = document.querySelector("canvas.experience");
// Scene
const scene = new THREE.Scene();
/**
* Sizes
*/
const sizes = {
width: window.innerWidth,
height: window.innerHeight,
};
window.addEventListener("resize", () => {
// Update sizes
sizes.width = window.innerWidth;
sizes.height = window.innerHeight;
// Update camera
camera.aspect = sizes.width / sizes.height;
camera.updateProjectionMatrix();
// Update renderer
renderer.setSize(sizes.width, sizes.height);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
});
/**
* Camera
*/
// Base camera
const camera = new THREE.PerspectiveCamera(
75,
sizes.width / sizes.height,
0.1,
100
);
camera.position.x = 0;
camera.position.y = 17;
camera.position.z = 22;
camera.rotation.x = -Math.PI / 8;
scene.add(camera);
//Controls -------------------
//Three.js vector lerping
let cameraTargetPosition = new THREE.Vector3(0, 17, 22);
window.addEventListener("mousedown", () => {
window.addEventListener("mousemove", updateCamera);
});
window.addEventListener("mouseup", () => {
window.removeEventListener("mousemove", updateCamera);
});
// Controls
function updateCamera(ev) {
ev.preventDefault();
if (ev.movementX > 0) {
cameraTargetPosition.x -= ev.movementX * 0.015;
} else {
cameraTargetPosition.x -= ev.movementX * 0.015;
}
if (ev.movementY > 0) {
cameraTargetPosition.z -= ev.movementY * 0.015;
} else {
cameraTargetPosition.z -= ev.movementY * 0.015;
}
}
/**
* Everything load
*/
let group = new THREE.Group();
async function loadModels(model, texture) {
const gltfLoader = new GLTFLoader();
const textureLoader = new THREE.TextureLoader();
const mesh = await gltfLoader.loadAsync(model);
const bakedTexture = textureLoader.load(texture);
const bakedMaterial = new THREE.MeshBasicMaterial({
map: bakedTexture,
});
bakedTexture.flipY = false;
bakedTexture.encoding = THREE.sRGBEncoding;
mesh.scene.children[0].material = bakedMaterial;
group.add(mesh.scene.children[0]);
}
loadModels(blueHouse, blueHouseBaked);
loadModels(greenHouse, greenHouseBaked);
loadModels(redHouse, redHouseBaked);
loadModels(purpleHouse, purpleHouseBaked);
loadModels(ground, groundBaked);
scene.add(group);
/**
* Renderer
*/
const renderer = new THREE.WebGLRenderer({
canvas: canvas,
antialias: true,
});
renderer.setSize(sizes.width, sizes.height);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
/**
* Animate
*/
const clock = new THREE.Clock();
let lastElapsedTime = 0;
// Ray Casting stuff
let raycaster = new THREE.Raycaster();
let mouse = new THREE.Vector2();
let currentIntersect = null;
window.addEventListener("mousemove", (event) => {
mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
});
console.log(scene.children[1].children[0]);
const tick = () => {
camera.position.lerp(cameraTargetPosition, 0.1);
const elapsedTime = clock.getElapsedTime();
const deltaTime = elapsedTime - lastElapsedTime;
lastElapsedTime = elapsedTime;
// Raycaster stuff
raycaster.setFromCamera(mouse, camera);
const intersects = raycaster.intersectObjects([scene.children[1].children]);
if (intersects.length) {
if (!currentIntersect) {
console.log("mouse enter");
}
currentIntersect = intersects[0];
} else {
if (currentIntersect) {
console.log("mouse leave");
}
currentIntersect = null;
}
// Render
renderer.render(scene, camera);
// Call tick again on the next frame
window.requestAnimationFrame(tick);
};
tick();
【问题讨论】:
-
发生这种情况是因为 console.log 是异步的。这里有人更好地解释了这个概念 - stackoverflow.com/a/23392650/4249232。在您执行 console.log 时,这些元素很可能存在于组中,但在打印时,它们已被删除。向我们展示更多代码,以便人们找出确切的问题
-
@SanilKhurana 感谢您抽出宝贵时间,刚刚添加了完整代码
标签: javascript three.js