我正在尝试使用Babylonjs来正确处理阴影。没有任何喜悦:p

这是我发现的阴影资源


Babylonjs wiki: Shadows
framework for building 3D games with HTML5 and WebGL


但我在“元素上的元素”阴影上找不到任何东西。 :(

这是我的尝试:
我的资料大致基于Babylonjs Wiki:17-Shadows

我有2盏灯和3个物体
我在球体后面得到阴影,但随后在球体的正面也得到了人工制品。

►实时代码:
jsfiddle.net/codemeasandwich/z64Ba

感谢您的帮助,因为我一直为此奋斗了一段时间。

function createSceneTuto(engine) {
    var scene = new BABYLON.Scene(engine);

    //freeCamera is a FPS like camera where you control the camera with the cursors keys and the mouse
    //touchCamera is a camera controlled with touch events (it requireshand.jsto work)
    //arcRotateCamera is a camera that rotates around a given pivot. It can be controlled with the mouse or touch events (and it also requires hand.js to work)

    // ArcRotateCamera >> Camera turning around a 3D point (here Vector zero)
    // Parameters : name, alpha, beta, radius, target, scene
  var camera = new BABYLON.ArcRotateCamera("Camera", 0, 0, 90, BABYLON.Vector3.Zero(), scene);
    camera.setPosition(new BABYLON.Vector3(30, 30, 30));

    // pointLight (like the sun for instance) which emits lights in every direction from a specific position
    // directionalLight which emits lights from the infinite towards a specific direction
    var light = new BABYLON.DirectionalLight("Dir0", new BABYLON.Vector3( -1,0, 0), scene);


        var light0 = new BABYLON.PointLight("Omni0", new BABYLON.Vector3(1, 10, 100), scene);
                light0.diffuse = new BABYLON.Color3( 0,1, 0);
                light0.specular = new BABYLON.Color3(1, 1, 1);

    var box = BABYLON.Mesh.CreateBox("Box", 3, scene);
    var torus = BABYLON.Mesh.CreateTorus("torus", 5, 1, 20, scene);
//  var plan = BABYLON.Mesh.CreatePlane("Plane", 50.0, scene);
    //      plan.position.z = -40
    var sphere = BABYLON.Mesh.CreateSphere("Sphere", 15, 20, scene);

    // Shadows
    var shadowGenerator = new BABYLON.ShadowGenerator(1024, light);
    var shadowGenerator0 = new BABYLON.ShadowGenerator(1024, light0);

        shadowGenerator.getShadowMap().renderList.push(box);
        shadowGenerator.getShadowMap().renderList.push(torus);
        shadowGenerator.getShadowMap().renderList.push(sphere);

        shadowGenerator0.getShadowMap().renderList.push(box);
        shadowGenerator0.getShadowMap().renderList.push(torus);
        shadowGenerator0.getShadowMap().renderList.push(sphere);

        box.receiveShadows = true;
        torus.receiveShadows = true;
        sphere.receiveShadows = true;

    var alphaTorus = 0, alphaBox =0;
        scene.registerBeforeRender(function () {
        torus.rotation.x += 0.02;
        torus.position = new BABYLON.Vector3(Math.cos(alphaTorus) * 15, 0, Math.sin(alphaTorus) * 15);
        alphaTorus += 0.003;

        box.position = new BABYLON.Vector3(Math.cos(alphaBox) * 15, 0, Math.sin(alphaBox) * 15);
        alphaBox += 0.01;
    });

    return scene;
}


►以上灯作为方向灯

var light = new BABYLON.DirectionalLight("Dir0", new BABYLON.Vector3( -1,0, 0), scene);
light.position = new BABYLON.Vector3(0, 0, 20);
light.intensity = 0.5;

var light0 = new BABYLON.DirectionalLight("Omni0", new BABYLON.Vector3(0,0,-1), scene);
light0.position = new BABYLON.Vector3(25, 0, 0);
light.intensity = 0.5;

最佳答案

只有定向光才能投射阴影,并且它们还需要一个位置来定义阴影的来源

我更新了Wiki以添加此重要信息:)


  只有定向光亮可以投射阴影:
  var light = new BABYLON.DirectionalLight(“ dir01”,new BABYLON.Vector3(-1,-2,-1),scene);
  
  您还必须为灯光定义一个位置(因为Babylon.js必须定义一个视点才能>创建阴影贴图):
  light.position = new BABYLON.Vector3(20,40,20);
  
  请注意,您必须移动位置以定义可见阴影的区域。

09-10 05:33
查看更多