简体   繁体   English

尝试将 webgl_interactive_cubes 与指针锁组合时无法读取未定义的属性(读取“getHex”)three.js

[英]Cannot read properties of undefined (reading 'getHex’) when trying to combine webgl_interactive_cubes with pointer lock three.js

I'm trying to create scene with walk-navigation, with interactive objects, for educational purpose.我正在尝试创建带有步行导航和交互式对象的场景,用于教育目的。 I'm using Pointer Lock Control example for a walk navigation and interactive cubes example from three.js. It's beginning so project is far from being perfect, although “walk” works.我正在使用Pointer Lock Control 示例进行步行导航和交互式立方体示例,来自 three.js。虽然“步行”有效,但它才刚刚开始,所以项目远非完美。 Unfortunately cursor part bugs out showing不幸的是 cursor 部分错误显示出来

Uncaught TypeError: Cannot read properties of undefined (reading 'getHex')
    at render (three-fps.js:200:62)
    at animate (three-fps.js:182:3)

this is my code:这是我的代码:

import * as THREE from "three";
import { PointerLockControls } from "three/examples/jsm/controls/PointerLockControls.js";

let canvas;
let camera, scene, raycaster, renderer;

let INTERSECTED;
let controls;

let moveForward = false;
let moveBackward = false;
let moveLeft = false;
let moveRight = false;
let canJump = false;

let prevTime = performance.now();
const velocity = new THREE.Vector3();
const direction = new THREE.Vector3();

const pointer = new THREE.Vector2();
const radius = 100;

init();
animate();

function init() {
  canvas = document.getElementById("canvas");

  camera = new THREE.PerspectiveCamera(
    70,
    window.innerWidth / window.innerHeight,
    1,
    10000
  );
  camera.position.y = 10;
  //controls
  controls = new PointerLockControls(camera, canvas);

  const onKeyDown = function (event) {
    switch (event.code) {
      case "ArrowUp":
      case "KeyW":
        moveForward = true;
        break;

      case "ArrowLeft":
      case "KeyA":
        moveLeft = true;
        break;

      case "ArrowDown":
      case "KeyS":
        moveBackward = true;
        break;

      case "ArrowRight":
      case "KeyD":
        moveRight = true;
        break;

      case "Space":
        if (canJump === true) velocity.y += 350;
        canJump = false;
        break;
    }
  };

  const onKeyUp = function (event) {
    switch (event.code) {
      case "ArrowUp":
      case "KeyW":
        moveForward = false;
        break;

      case "ArrowLeft":
      case "KeyA":
        moveLeft = false;
        break;

      case "ArrowDown":
      case "KeyS":
        moveBackward = false;
        break;

      case "ArrowRight":
      case "KeyD":
        moveRight = false;
        break;
    }
  };

  document.addEventListener("keydown", onKeyDown);
  document.addEventListener("keyup", onKeyUp);

  scene = new THREE.Scene();
  scene.background = new THREE.Color(0xf0f0f0);

  const light = new THREE.DirectionalLight(0xffffff, 1);
  light.position.set(1, 1, 1).normalize();
  scene.add(light);

  const geometry = new THREE.BoxGeometry(20, 20, 20);

  for (let i = 0; i < 2000; i++) {
    const object = new THREE.Mesh(
      geometry,
      new THREE.MeshLambertMaterial({ color: Math.random() * 0xffffff })
    );

    object.position.x = Math.random() * 800 - 400;
    object.position.y = Math.random() * 800 - 400;
    object.position.z = Math.random() * 800 - 400;

    object.rotation.x = Math.random() * 2 * Math.PI;
    object.rotation.y = Math.random() * 2 * Math.PI;
    object.rotation.z = Math.random() * 2 * Math.PI;

    object.scale.x = Math.random() + 0.5;
    object.scale.y = Math.random() + 0.5;
    object.scale.z = Math.random() + 0.5;

    scene.add(object);
  }

  raycaster = new THREE.Raycaster();
  // floor

  let floorGeometry = new THREE.PlaneGeometry(2000, 2000, 100, 100);
  floorGeometry.rotateX(-Math.PI / 2);

  const floorMaterial = new THREE.MeshBasicMaterial({ color: 0xffffff });

  const floor = new THREE.Mesh(floorGeometry, floorMaterial);
  scene.add(floor);

  // Create a WebGL renderer
  renderer = new THREE.WebGLRenderer({ canvas });
  renderer.setPixelRatio(window.devicePixelRatio);
  renderer.setSize(canvas.clientWidth, canvas.clientHeight);

  document.addEventListener("mousemove", onPointerMove);

  //

  window.addEventListener("resize", onWindowResize);
}

function onWindowResize() {
  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix();

  renderer.setSize(window.innerWidth, window.innerHeight);
}

function onPointerMove(event) {
  pointer.x = (event.clientX / window.innerWidth) * 2 - 1;
  pointer.y = -(event.clientY / window.innerHeight) * 2 + 1;
}

//

function animate() {
  requestAnimationFrame(animate);
  
  const time = performance.now();
  const delta = (time - prevTime) / 1000;
  velocity.x -= velocity.x * 10.0 * delta;
  velocity.z -= velocity.z * 10.0 * delta;
  direction.z = Number(moveForward) - Number(moveBackward);
  direction.x = Number(moveRight) - Number(moveLeft);
  direction.normalize(); // this ensures consistent movements in all directions
  if (moveForward || moveBackward) velocity.z -= direction.z * 400.0 * delta;
  if (moveLeft || moveRight) velocity.x -= direction.x * 400.0 * delta;
  controls.moveRight(-velocity.x * delta);
  controls.moveForward(-velocity.z * delta);
  prevTime = time;
  camera.updateMatrixWorld();

  render();
}

function render() {
  camera.updateMatrixWorld();

  // find intersections

  raycaster.setFromCamera(pointer, camera);

  const intersects = raycaster.intersectObjects(scene.children, false);

  if (intersects.length > 0) {
    if (INTERSECTED != intersects[0].object) {
      if (INTERSECTED)
        INTERSECTED.material.emissive.setHex(INTERSECTED.currentHex);

      INTERSECTED = intersects[0].object;
      INTERSECTED.currentHex = INTERSECTED.material.emissive.getHex();
      INTERSECTED.material.emissive.setHex(0xff0000);
    }
  } else {
    if (INTERSECTED)
      INTERSECTED.material.emissive.setHex(INTERSECTED.currentHex);

    INTERSECTED = null;
  }

  renderer.render(scene, camera);
}

 // check for undefined 'emissive' on material if (INTERSECTED.material.emissive.= undefined) { INTERSECTED.currentHex = INTERSECTED.material.emissive;getHex(). INTERSECTED.material.emissive;setHex(0xff0000); }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 未捕获(承诺)TypeError:无法读取 three.js 顶点的未定义属性(读取“长度”) - Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'length') for vertices of three.js Three.js “webgl-template.html:69 Uncaught TypeError: Cannot read property 'domElement' of undefined”错误 - Three.js “webgl-template.html:69 Uncaught TypeError: Cannot read property 'domElement' of undefined" error webgl three.js-如何显示精灵? 错误:未被捕获的TypeError:无法在SpritePlugin.render读取未定义的属性&#39;x&#39; - webgl three.js - how to display a sprite ? Error: Uncaught TypeError: Cannot read property 'x' of undefined at SpritePlugin.render 尝试使用“then”promise 时无法读取未定义的属性(读取“then”) - Cannot read properties of undefined (reading 'then') when trying to use a 'then' promise 尝试使成员静音时无法读取未定义的属性(读取“id”) - Cannot read properties of undefined (reading 'id') when trying to mute a member 三.js - “未捕获的类型错误:无法读取未定义的属性&#39;中心&#39; - 三.js:6754”当我添加另一个网格时发生 - three.js - "Uncaught TypeError: Cannot read property 'center' of undefined - three.js:6754" Is happenning when i add another Mesh 如何为Three.js中的多维数据集赋予各种属性? - How to give various properties to cubes in three.js? 尝试在three.js中渲染圆柱体,失败并出现错误“无法读取未定义的属性&#39;类型&#39;” - Trying to render cylinder in three.js, failing with err "Cannot read property 'type' of undefined" Three.JS中的立方体立方体 - Cube of Cubes in Three.JS 使用 js 时无法读取未定义的属性(读取“执行”) - Cannot read properties of undefined (reading 'execute) when i using js
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM