首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ThreeJS和PhysiJS“类构造函数如果没有‘新’就无法调用

ThreeJS和PhysiJS“类构造函数如果没有‘新’就无法调用
EN

Stack Overflow用户
提问于 2021-11-15 16:05:58
回答 1查看 587关注 0票数 1

我正在尝试将PhysiJS实现到我的ThreeJS项目中。

为了简化我从web下载了这个项目: https://rawgit.com/mmmovania/Physijs_Tutorials/master/MultipleBoxes.html

我的项目设置可以在这里获得: https://drive.google.com/drive/folders/1lO-8YQtWkOPDhsEpk1LzuPajoPjsBnyo?usp=sharing

Problem当我下载了所有文件(html,js)时,我尝试运行它。当它从我的计算机上运行时,我会收到一个错误。

我对JavaScript还是很陌生的,我有点理解问题是什么,但不知道如何解决。我遗漏了什么?这是完全相同的项目,在我的电脑上,它是在网络上。

以下是错误:

代码语言:javascript
运行
复制
**three.js:34977 THREE.Quaternion: .inverse() has been renamed to invert().

Quaternion.inverse @ three.js:34977
physi.js:391 Uncaught TypeError: Class constructor Scene cannot be invoked without 'new'
    at new window.Physijs.Physijs.Scene (physi.js:391)
    at init (MultipleBoxes.html:71)
    at MultipleBoxes.html:51**
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-17 04:39:44

init()更改为window.onload = init();,使脚本文件在init()之前有机会完全加载。

代码语言:javascript
运行
复制
'use strict';


var initScene, render, renderer, scene, camera, box, floor;
var container;
var camera, scene, controls, renderer;
var mouseX = 0,
  mouseY = 0;
var windowHalfX = window.innerWidth / 2;
var windowHalfY = window.innerHeight / 2;
var clock;

var NUM_BOXES = 10;

// always wait for all scripts to load before doing assignments
window.onload = function() {
  init();
  animate();
}



function init() {


  // initialize your script and set assignments
  Physijs.scripts.worker = 'js/physijs_worker.js';
  Physijs.scripts.ammo = 'ammo.js';

  clock = new THREE.Clock();


  container = document.createElement('div');
  document.body.appendChild(container);

  camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 10000);

  camera.position.z = 20;
  camera.position.y = 5;

  controls = new THREE.OrbitControls(camera);


  // scene

  //scene = new THREE.Scene();
  scene = new Physijs.Scene;
  scene.setGravity(new THREE.Vector3(0, -10, 0));

  //floor
  floor = new Physijs.BoxMesh(
    new THREE.CubeGeometry(20, 0.1, 20),
    new THREE.MeshPhongMaterial({
      color: 0xffffff
    }),
    0 //mass
  );
  floor.receiveShadow = true;
  floor.position.set(0, 0, 0);
  scene.add(floor);


  var loader = new THREE.ImageLoader(manager);
  var crateTexture = new THREE.Texture();

  loader.load('textures/crate.jpg', function(image) {
    crateTexture.image = image;
    crateTexture.needsUpdate = true;
  });

  // Box
  var boxGeometry = new THREE.CubeGeometry(1, 1, 1);
  var boxMaterial = new THREE.MeshPhongMaterial({
    color: 0xffffff,
    map: crateTexture
  });

  for (var i = 0; i < NUM_BOXES; ++i) {
    var box = new Physijs.BoxMesh(boxGeometry, boxMaterial);
    box.castShadow = true;
    box.position.y = 10 + 2 * i;
    scene.add(box);
  }


  var manager = new THREE.LoadingManager();
  manager.onProgress = function(item, loaded, total) {
    console.log(item, loaded, total);
  };


  var ambientLight = new THREE.AmbientLight(0x707070);
  scene.add(ambientLight);

  var light = new THREE.DirectionalLight(0xffffff, 1);
  light.position.set(-10, 18, 5);
  light.castShadow = true;
  var d = 14;
  light.shadow.camera.left = -d;
  light.shadow.camera.right = d;
  light.shadow.camera.top = d;
  light.shadow.camera.bottom = -d;

  light.shadow.camera.near = 2;
  light.shadow.camera.far = 50;

  light.shadow.mapSize.x = 1024;
  light.shadow.mapSize.y = 1024;

  scene.add(light);

  //

  renderer = new THREE.WebGLRenderer();
  renderer.setPixelRatio(window.devicePixelRatio);
  renderer.setSize(window.innerWidth, window.innerHeight);
  renderer.shadowMap.enabled = true;
  container.appendChild(renderer.domElement);

  container.appendChild(renderer.domElement);

  document.addEventListener('mousemove', onDocumentMouseMove, false);
  window.addEventListener('resize', onWindowResize, false);

}

function onWindowResize() {

  windowHalfX = window.innerWidth / 2;
  windowHalfY = window.innerHeight / 2;

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

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

}

function onDocumentMouseMove(event) {

  mouseX = (event.clientX - windowHalfX) / 2;
  mouseY = (event.clientY - windowHalfY) / 2;

}

//

function animate() {

  requestAnimationFrame(animate);
  render();

}

function render() {
  var deltaTime = clock.getDelta();
  controls.update(deltaTime);
  scene.simulate(); // run physics

  camera.lookAt(scene.position);

  renderer.render(scene, camera);

}
代码语言:javascript
运行
复制
body {
  font-family: Monospace;
  background-color: #000;
  color: #fff;
  margin: 0px;
  overflow: hidden;
}

#info {
  color: #fff;
  position: absolute;
  top: 10px;
  width: 100%;
  text-align: center;
  z-index: 100;
  display: block;
}

#info a,
.button {
  color: #f00;
  font-weight: bold;
  text-decoration: underline;
  cursor: pointer
}
代码语言:javascript
运行
复制
<!DOCTYPE html>
<html lang="en">

<head>
  <title>Physijs + THREE.js = Multiple Boxes Demo</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
  <style>
    /* moved to separate box for stackoverflow answer 
   (see CSS box)
  */
  </style>
</head>

<body>

  <script src="js/three.js"></script>
  <script type="text/javascript" src="js/physi.js"></script>
  <script src="js/controls/OrbitControls.js"></script>

  <script>
    /* moved to javascript box */
  </script>

</body>

</html>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69977377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档