Three.js - 为什么这些物品的阴影看起来像这样?

时间:2017-12-27 17:48:31

标签: javascript three.js shadows

我正在学习three.js。

我做了一个练习的例子,但项目的阴影看起来不对或陌生。

This is my problem: the shadows

应该是这样的(这张图片是旧教程):

Good shadows

代码是这样的:



Accounts[] accounts = [0000000001, 0000000003, 0000000002]




并且,如果你知道一个好的初学者three.js教程或课程(我不在乎,如果它不是免费),请告诉我,因为我有点迷失在这和网络开发者一样,我对这个webGL世界感兴趣:)

2 个答案:

答案 0 :(得分:4)

您可以通过增加阴影贴图的大小来提高阴影的质量(请参阅SpotLight):

var spotLight = new THREE.SpotLight(0xffffff, 0.8);
spotLight.position.set(-40, 60, -10);
spotLight.castShadow = true;

spotLight.shadow.mapSize.width = 2048;
spotLight.shadow.mapSize.height = 2048;

通过限制光点的光锥角度可以进一步提高质量:

spotLight.angle = Math.PI / 8.0;

注意,这会导致阴影贴图的分辨率增加,阴影贴图所在的区域也会减少。

请参阅代码段:

var renderer, camera, scene, controls;

var init = function (){
  scene  = new THREE.Scene();
  camera = new THREE.PerspectiveCamera (45, window.innerWidth/window.innerHeight, 0.1, 1000); 
  renderer = new THREE.WebGLRenderer(); 
  controls = new THREE.OrbitControls( camera );

  var color = new THREE.Color("rgb(200, 250, 250)");
  renderer.setClearColor(new THREE.Color(color));
  renderer.setSize(window.innerWidth, window.innerHeight);

  renderer.shadowMap.enabled = true;
  renderer.shadowMap.type = THREE.PCFSoftShadowMap; // default THREE.PCFShadowMap


  var ejesAyuda = new THREE.AxesHelper(20); //son los ejes de ayuda creo
  scene.add(ejesAyuda); 

  var planeGeometry = new THREE.PlaneGeometry(60, 20);
  var planeMaterial = new THREE.MeshLambertMaterial({color: 0xcccccc});

  var plane = new THREE.Mesh(planeGeometry, planeMaterial);
  plane.receiveShadow = true;
  plane.rotation.x = -0.5*Math.PI; // -90º
  plane.position.x = 15;
  plane.position.y = 0;
  plane.position.z = 0;
  scene.add(plane);


  var cubeGeometry = new THREE.CubeGeometry( 4, 4, 4);
  var cubeMaterial = new THREE.MeshLambertMaterial({color: 0xff0000});
  var cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
  cube.castShadow = true; //con esto le indicamos que queremos que emita sombra
  cube.position.x= -4;
  cube.position.y = 3;
  cube.position.z = 0;
  scene.add(cube);

  var sphereGeometry = new THREE.SphereGeometry (4, 20, 20);
  var sphereMaterial = new THREE.MeshLambertMaterial({color: 0x7777ff});
  var sphere = new THREE.Mesh (sphereGeometry, sphereMaterial);
  sphere.castShadow = true; //con esto le indicamos que queremos que emita sombra
  sphere.position.x = 20;
  sphere.position.y = 4;
  sphere.position.z = 2;
  scene.add(sphere);

  camera.position.x = -30;
  camera.position.y = 40;
  camera.position.z = 30;
  camera.lookAt(scene.position); 

  var spotLight = new THREE.SpotLight(0xffffff, 0.8);
  spotLight.position.set(-40, 60, -10);
  spotLight.castShadow = true;
  spotLight.angle = Math.PI / 8.0;
  spotLight.shadow.mapSize.width = 2048;
  spotLight.shadow.mapSize.height = 2048;
  scene.add(spotLight);

  document.getElementById("WebGL-salida").append(renderer.domElement);
  resize();
  window.onresize = resize;
};

function animate() {
    requestAnimationFrame( animate );
    renderer.render( scene, camera );
}

function resize() {
    renderer.setSize(window.innerWidth, window.innerHeight);
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
//controls.handleResize();
}

init();
animate();
<script src="https://threejs.org/build/three.min.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>
<div id="WebGL-salida">
</div>

答案 1 :(得分:0)

您还可以增加细分数量。现在你有

var sphereGeometry = new THREE.SphereGeometry(4, 20, 20);

对于良好的渲染,这两个&#39; 20略低。我一般使用32,32