Is there any way to prevent these faces from being displayed?

Recently, I've been working on a cube-based game using three.js and encountered an issue with rendering transparency in blocks.

These blocks are loaded from a JSON file, where each block is defined like this:

{
    'sprite': 'water.png',
    'collides': false,
    'moves': false,
    'transparent': true
}

To handle transparency, I create textures in the renderer based on the sprite and transparent value of each block.

var texture = THREE.ImageUtils.loadTexture('/img/' + 
    _materials[i].sprite);

var properties = {
    map: texture
};

if(_materials[i].transparent) {
    properties.opacity = 0.3;
    properties.transparent = true;
}

materials[i] = new THREE.MeshBasicMaterial(properties);

The issue arises when trying to render water blocks, as you can see the faces of adjacent blocks through transparent ones. Any suggestions on how to prevent this from occurring?

Answer №1

To create a simple solution, consider using multi-materials for CubeGeometry.

Follow these steps:

var texture = THREE.ImageUtils.loadTexture('/img/' + 
    _materials[i].sprite);

var properties = {
     map: texture
};
// Apply a hidden faces texture with an opacity of 0
var hiddenMaterial = new THREE.MeshBasicMaterial({color:0xFFFFFF, transparent:true, opacity:0});


if(_materials[i].transparent) {
    properties.opacity = 0.3;
    properties.transparent = true;
}

waterMaterial = new THREE.MeshBasicMaterial(properties);

var finalMaterial = new THREE.MeshFaceMaterial([ hiddenMaterial, hiddenMaterial, waterMaterial, hiddenMaterial, hiddenMaterial, hiddenMaterial]);
// Assuming index 2 represents the top face, depending on cube orientation

var mesh = new THREE.Mesh(CubeGeo, finalMaterial);

Best regards.

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

Is there a correct way to properly duplicate a JSON array in Redux?

As a newcomer to Redux, I found the concepts somewhat confusing at first. For instance, imagine that there is an array in the redux state. const state = [ {show: false, id : '1'}, {show: false, id : '2'}, {show: false, id : &apo ...

Having trouble with Laravel Vue.js mixins not receiving function responses?

I'm currently working with Laravel 5.8 and Vue.js. I've created a function for handling post/get requests in a more generalized way. However, I'm facing an issue where I am not receiving the expected response from the mixins function. Below ...

What is the best way to display the contents of an array that contains another array within it?

I need help looping through this array and displaying the "roleName" value. I want to use the map method to iterate over it. { "userMenuDTO": { "menuId": "13", "menuName":"PruebaMenu900 ...

Verify the role upon logging in

After downloading the Yeoman Angular Fullstack, I noticed that it already has the basic login configuration in place. The login code snippet looks like this: $scope.login = function(form) { $scope.submitted = true; if(form.$valid) { Auth.login({ ...

Resetting text in an input field using CSS

Here is the fiddle link for reference: http://jsfiddle.net/a765q/1/. I noticed that when I click the reset button, the text color changes to grey. Any ideas on how to fix this? ...

Trouble shooting: Angular 2 Http get request not firing

I'm facing an issue where nothing happens when I try to subscribe to my observable. There are no errors in the console or during the build process. Below is the code snippet that I am using: My service getBlueCollars(): Observable<BlueCollar[]& ...

Error: No package.json file found after publishing npm package with ENOLOCAL

Ecosystem using <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="335d435e73051d021d03">[email protected]</a> using <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c6a8a9a2a386b0fee8f7f7e ...

Transferring a single dataset from a table to a pop-up modal using Angular

I am working on a table to display entries for a contest, extracted from a database using PHP and converted into a .json object for AngularJS and JavaScript. I want to add a modal feature so that when a "judge" clicks on an entry, they can view its details ...

Utilizing JavaScript: Passing a parameter into a function to be used with getElementById()

Implementing a feature that displays statistics by incrementing rapidly until reaching their final value when the element is in view, creating the illusion of a rising number. Encountering some difficulty in passing the necessary parameters to identify th ...

What is the best way to execute methods once subscription data is received?

Exploring the most effective way to execute multiple methods when new data arrives from an Observable, such as an HTTP request, and those methods need to be called with the data. I have been experimenting with two different approaches, but I find drawback ...

Utilizing Flask to gather information from a leaflet map

I am currently working on creating a webpage using Flask. The webpage features a leaflet map where users can click to create a marker that opens a popup window with a link. The link's purpose is to open a new page displaying the longitude and latitude ...

Creating a filter using radio input in HTML and CSS is a simple and

Currently, I am delving into the world of Javascript and React, but I have hit a roadblock. My goal is to create a Pokedex, yet I am encountering some difficulties. I have implemented Radio Inputs to filter Pokemon by generation, but I am struggling with ...

Using cascading style sheets to switch a page into editing mode

Is it possible to change the view of a page after clicking a button without using javascript, and instead relying solely on CSS? I want to display a page with information where users can click an edit button and make changes within the same view rather th ...

XPathSelectorError: The provided xpath expression is invalid and unable to locate the specified element

Here is an HTML snippet element: <a ng-click="nodes.setViewType('tiles',true)"> <span class="fa fa-check Tick-Inactive" ng-class="nodes.viewType == 'tiles'? 'Tick-Active':'Tick-Inactive'" style="">< ...

A guide on sending arrays from javascript to a Laravel controller through axios

Currently, I am utilizing Laravel 5.4 and Vue 2 to manage my data. I am facing an issue where I need to call a controller method using axios while passing two arrays. These arrays are crucial for making database requests in the controller and retrieving ne ...

Unveiling the secrets of interacting with localstorage in react.js

I'm currently facing an issue with a component that retrieves data from an array stored in local storage. Although the initial data is fetched when the page loads, I am unsure how to update it when changes are made in local storage. import React, {Co ...

The art of navigating a Three.js camera

Here's the scenario: We are dealing with a Mesh that is positioned at POS with a rotation of ROT. Additionally, there is a camera that is positioned and rotated relative to the Mesh. For example, the camera has a position of CPOS and a rotation of CR ...

Is there a way to create optional sections within a reusable component's template in a Vue 3 application?

Recently, I've been immersed in developing a Single Page Application (SPA) using the powerful combination of Vue 3, TypeScript, and integrating The Movie Database (TMDB) API. One interesting challenge I encountered was with my versatile movie card co ...

Transforming JSON arrays into object representations

I have a collection of components structured like this: var names = 1)"lat: 40.6447077, lng: -73.878421, address: 1600 Pennsylvania Avenue, Brooklyn, NY 11239, USA" 2)"lat: 40.609099, lng: -73.931516, address: 2015 E. 35th street, Brooklyn, Ny, Un ...

Renaming and destructuring of an array's length using ReactJS

I am working with a reduce function shown below: let el = scopes.reduce ((tot, {actions}) => tot + actions.length, 0); I attempted to modify it as follows, but it appears that this is not the correct approach: let el = scopes.reduce ((tot, {actions.l ...