Shadows stripped from collada models

In my current scene, I have incorporated two collada objects along with a directional light setup. The first collada object resembles a plane, while the second one consists of multiple boxes.

Upon rendering the scene, it seems that certain "side" shadows are appearing distorted, although the shadows cast on the ground appear to be rendered correctly.

.

After investigating the issue further, I suspected that it might be related to the collada files themselves. To test this theory, I added a basic cube (the larger one above all) to the scene, but unfortunately encountered the same shadow rendering problem.

If anyone has any insights or solutions to this issue, I would greatly appreciate it.

I am currently using the latest revision of three.js (r71) and have tested the scene on Google Chrome and Mozilla Firefox (MacOS). Despite experimenting with various shadow-related attributes of the directional light, I have not been able to resolve the problem. I have not delved into shadowCascade attributes since they are not being used in my setup. Additionally, I have played around with renderer's shadow settings without much success.

Below is my configuration for the directional light:

var directionalLight = new THREE.DirectionalLight( 0xffffff, 1 );
directionalLight.target.position = THREE.Vector3(0, 0, 0);
directionalLight.position.set( 250, 500, 250 );
directionalLight.castShadow = true;
directionalLight.shadowCameraNear = 100;
directionalLight.shadowCameraFar = 1000;
directionalLight.shadowMapWidth = 2048;
directionalLight.shadowMapHeight = 2048;
directionalLight.shadowBias = 0.0001;
directionalLight.shadowDarkness = 0.5;
directionalLight.shadowCameraLeft = -300;
directionalLight.shadowCameraRight = 300;
directionalLight.shadowCameraTop = 300;
directionalLight.shadowCameraBottom = -300;
directionalLight.shadowCameraVisible = true;

Both my collada objects and the shadowCamera bounds are relatively large in size.

As for the renderer setup:

renderer = new THREE.WebGLRenderer( {antialias: true} );
renderer.setClearColor(0x222222);
renderer.shadowMapEnabled = true;
renderer.shadowMapSoft = true;
renderer.shadowMapType = THREE.PCFSoftShadowMap;
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize( window.innerWidth, window.innerHeight );

Here is another perspective of the scene, mainly showcasing the lighting arrangement.

EDIT: Below is a snippet of additional information:

var container;
var camera, scene, renderer, controls;
var particleLight;

scene = new THREE.Scene();
init();
animate();

function init() {

  container = document.createElement( 'div' );
  document.body.appendChild( container );
  camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 2000 );
  camera.position.set( 300, 100, 0 );

// Controls
  controls = new THREE.OrbitControls( camera );

  
   
// Cube
  var geometry = new THREE.BoxGeometry( 100, 100, 100 );
  var material = new THREE.MeshLambertMaterial();
  var cube = new THREE.Mesh( geometry, material );
  cube.position.y = 50;
  cube.rotation.y = 0.8;
  cube.castShadow = true;
  cube.receiveShadow = true;
  scene.add( cube );

// Plane
  var planeGeometry = new THREE.PlaneBufferGeometry( 300, 300, 300 );
  var plane = new THREE.Mesh( planeGeometry, material );
  plane.position.set( 0, 0, 0 );
  plane.rotation.x = -1.6;
  plane.castShadow = true;
  plane.receiveShadow = true;
  scene.add( plane );
  
// Light

  var directionalLight = new THREE.DirectionalLight( 0xffffff, 1 );
  directionalLight.target.position = THREE.Vector3(0, 0, 0);
  directionalLight.position.set( 250, 500, 250 );
  directionalLight.castShadow = true;
  directionalLight.shadowCameraNear = 100;
  directionalLight.shadowCameraFar = 1000;
  directionalLight.shadowMapWidth = 2048;
  directionalLight.shadowMapHeight = 2048;
  directionalLight.shadowBias = 0.0001;
  directionalLight.shadowDarkness = 0.5;
  directionalLight.shadowCameraLeft = -300;
  directionalLight.shadowCameraRight = 300;
  directionalLight.shadowCameraTop = 300;
  directionalLight.shadowCameraBottom = -300;
  directionalLight.shadowCameraVisible = true;
  scene.add( directionalLight );

  scene.add( new THREE.AmbientLight( 0x555555 ) );
  renderer = new THREE.WebGLRenderer( {antialias: true} );
  renderer.setClearColor(0x222222);
  renderer.shadowMapEnabled = true;
  renderer.shadowMapSoft = true;
  renderer.shadowMapType = THREE.PCFSoftShadowMap;
  renderer.setPixelRatio( window.devicePixelRatio );
  renderer.setSize( window.innerWidth, window.innerHeight );
  container.appendChild( renderer.domElement );

  window.addEventListener( 'resize', onWindowResize, false );
}

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


function animate() {
  requestAnimationFrame( animate );
  render();
}

var clock = new THREE.Clock();

function render() {
  var timer = Date.now() * 0.0005;
  camera.lookAt(new THREE.Vector3(0, 0, 0));
  renderer.render( scene, camera );
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r71/three.min.js"></script>
<script src="http://threejs.org/examples/js/controls/OrbitControls.js"></script>

Your assistance is highly appreciated.

Answer №1

Your scene is experiencing self-shadowing due to the alignment of the directional light rays with some faces of your geometry. To address this issue, try adjusting the position of the directional light slightly. For instance,

directionalLight.position.set( 250, 500, 200 );

In most cases, tweaking light.shadow.bias can help mitigate self-shadowing problems, but when the light ray and face are parallel like in your scenario, this solution may not be effective.

Additionally, consider setting shadow.bias to a negative value to reduce artifacts on other surfaces.

directionalLight.shadow.bias = - 0.01;

However, keep in mind that this adjustment might introduce "Peter Panning" artifacts, as is often the case.

Sometimes, such compromises are necessary. You may need to experiment with setting the bias based on the camera position to find a suitable balance.

Version used: three.js r.75

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Accessing Private Files with Signed URLs from AWS S3

Issue: The challenge is to securely allow users to upload a file and retrieve it later. The files are stored in private Buckets and objects using S3 pre-signed URLs for uploading. However, fetching the file poses a problem as the signed URLs expire after ...

Using C# to send pictures to a WhatsApp contact

Is it possible to send an image along with a text message to a WhatsApp number through the API? https://api.whatsapp.com/send?phone=15551234567&text=I'm%20interested%20in%20your%20car%20for%20sale I have successfully sent text messages using thi ...

How can I use Wicket to dynamically change a component's className when a button is disabled?

Let's consider the following example: <span class="button4"> <button wicket:id="saveButton" type="submit"> <wicket:message key="modalArchiveAccount.button.save" /> </button> </span> When working with java cod ...

An Ajax call encountered a circular reference error

Within my webmethod, I am creating a table dynamically. Public Table Buildtbl { Table mytable = new Table(); TableRow th = new TableRow(); TableHeaderCell tc1 = new TableHeaderCell(); tc1.Text = "Header1"; TableHeaderCell tc2 = new TableHeaderCell(); tc2 ...

Enhancing Bootstrap modals with dynamic content and integrating Ajax for dynamic data retrieval in Laravel

I am facing some challenges while coding in Laravel, specifically with passing data to a modal (using the Bootstrap framework) and sending data to an Ajax post request. I have an array of items with an 'id', a 'name', and 'content& ...

Utilize jQuery's addClass Method when Submitting a Form Using Ajax

When the form is submitted, I would like to add a class and display a loading animation before executing the AJAX request. However, when setting async to false in the AJAX call, the AJAX request will be executed first before displaying the loading animatio ...

Guide to using AES-256-CBC encryption in Node.js and decrypting with OpenSSL on a Linux system

Question: Hello there, I am currently facing an issue with decrypting my encoded base64 using a specific command. Here is the command that I am trying to use: echo "base64key" | (openssl enc -AES-256-cbc -d -a -pass "pass:test" -pbkdf2 ...

Is there a way to identify the duplicated input element values using jquery?

Just starting out in the world of web development and jQuery. I have an input element that has been bound with a blur event. Here's the code snippet: // Here are my input elements: <input class="input_name" value="bert" /> <input class="inp ...

Mastering the art of sorting HTML tables with various columns using JavaScript and jQuery

When they click the button, it should alphabetize the rows in the table according to the clicked column. Is there a way to achieve this sorting functionality without using a javascript/jquery plugin or library? I prefer to develop my own code for this pa ...

What is the best way to display the original array when the search input for the title is left blank?

When I enter a todo item title in the search input field and then clear the search input, I expect the initial array of todos to be rendered again. I attempted to accomplish this using an if statement but it did not work - only the previously searched todo ...

Determine if the specific subroute has a child using vue-router

After checking similar questions on stackoverflow without success, I am seeking a solution. I am attempting to determine if a subroute is a child of a specific route in order to display a container. Unfortunately, the following code snippet does not work: ...

Could someone provide a detailed explanation of the i++ and y++ sections in this code, particularly the else block? I am struggling to grasp how the result is being generated

I am struggling with understanding the code for a Fibonacci Generator. What is the purpose of i++ and y++ in this context, and how do they contribute to generating the sequence? :( function fibonacciGenerator(n) { var fib = [0, 1]; var i = 0; var ...

Sending information from a parent component to a child component in Vue.js and then showcasing the data

Hey there! I'm new to vue.js and I'm struggling to figure out why my data is not being passed to the child component. I've tried a few different approaches, but none seem to be working as expected. It feels like I'm really close, but so ...

Dividing a U8IntArray in JavaScript

Looking to divide a U8IntArray that contains 20 bytes into two parts: the first 8 bytes and the remaining byte 9 to 20. var u8Array = new Uint8Array(20); var part1 = u8Array.subarray(0, 8); var part2 = u8Array.subarray(8); console.log(part1, part2); Th ...

In the React application, there seems to be a discrepancy between the date and date format displayed in the API preview and the console

In my React-Node application, there is a discrepancy in the date-time format when I call a node API. The Developer's Network tab shows the correct datetime format in the preview, but when I console log the API response, it displays the datetime in a l ...

What is the simplest method for finding the position of a child element in relation to its parent?

My HTML markup is structured similarly to this: <div id="parentElement"> <div class="child"></div> <div class="child"></div> <div class="child"></div> <div class="child"></div> </div ...

Utilizing Express JS to keep users on the same page upon submitting a form

Although this may seem like a simple query with available tutorials, I am struggling to locate the specific information. I utilized express-generator to create an app and included a basic form in a route. views/form.ejs <div> <h1>This is < ...

Tips for retrieving text from an element that is nested within an element's promise in Appium

Here's a snippet of code I'm working with: const wd = require('wd') const driver = await wd.promiseChainRemote("http://localhost:4723/wd/hub") elements = await driver.elementsByAccessibilityId("commonElementsId") I have received a pro ...

Preparing my FoodApp API database with Faker requires using either import or require in separate files - cannot use both in one

I'm attempting to use the Faker npm package to populate my new database with test data in order to properly evaluate my filters. The problem arises when I try to combine both require and import in the same application. While all of my other packages r ...

Disregard all numbers following the period in regex

I have developed a function to format numbers by adding commas every 3 digits: formatNumber: (num) => { return num.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,') }, The issue with this function is that it also add ...