Three.js中BoxGeometry加厚度后THREE.BackSide失效,如何让厚墙同平面墙一致?
THREE.BackSide Behavior for Thick Walls Hey there! Let's break down why your thick walls are ignoring the THREE.BackSide setting and how to get them behaving just like your original plane walls.
Why the Problem Happens
Your original plane was a single-sided geometry—THREE.BackSide only controlled whether that one face's back side was rendered. When you added thickness, you turned that plane into a 3D object with multiple faces (like the front, back, and side faces of a rectangular prism). Each of these new faces has its own front/back normal direction, and the BackSide setting now applies to all of them. This means some faces (like the sides) might have their back side facing your camera, causing them to render when you don't want them to.
Solutions to Match Original Plane Behavior
1. Reverse Geometry Normals + Use THREE.FrontSide
Instead of relying on BackSide, flip all the normals of your thick geometry so the "inside" of the wall becomes the front face. Then use FrontSide to only render those inward-facing fronts—just like your original plane hid when facing the camera.
Here's how to do it in code:
// Assume thickWallGeometry is your extruded/thickened geometry thickWallGeometry.computeVertexNormals(); // Flip every face's normal and vertex normals thickWallGeometry.faces.forEach(face => { face.normal.multiplyScalar(-1); face.vertexNormals.forEach(normal => normal.multiplyScalar(-1)); }); // Create your material with FrontSide const wallMaterial = new THREE.MeshStandardMaterial({ side: THREE.FrontSide, // Add your other material properties (color, roughness, etc.) }); const thickWall = new THREE.Mesh(thickWallGeometry, wallMaterial);
2. Adjust Extrusion Direction (If Using ExtrudeGeometry)
If you used ExtrudeGeometry to add thickness, you can reverse the extrusion direction by using a negative depth value. This makes the extruded geometry's outer faces face inward, so THREE.BackSide will behave the same way it did with your original plane.
Code example:
// Define your original wall shape const wallShape = new THREE.Shape(/* Your 2D shape coordinates here */); // Set extrusion settings with negative depth to reverse direction const extrudeSettings = { depth: -0.5, // Adjust this value to match your desired thickness bevelEnabled: false // Disable bevel to keep clean edges like your plane }; const thickWallGeometry = new THREE.ExtrudeGeometry(wallShape, extrudeSettings); // Use your original BackSide material const wallMaterial = new THREE.MeshStandardMaterial({ side: THREE.BackSide, // Your material properties }); const thickWall = new THREE.Mesh(thickWallGeometry, wallMaterial);
Quick Note for BoxGeometry Users
If you built your thick wall with BoxGeometry, you can use the same normal-reversing method from Solution 1. Just flip all the face normals, then use FrontSide to hide the wall when viewed from outside.
Give these methods a shot—either one should make your thick walls act exactly like the original plane. If you hit any issues, feel free to share more details about how you're creating the thick geometry!
内容的提问来源于stack exchange,提问作者EnginO

