Calculating the angle between two planes in Three.js is a useful technique

I'm currently developing a project with the three.js library, and I am curious about how to calculate the angle (let's refer to it as α) between two plane geometries. You can find a helpful visual representation of the planes in this image.

Answer №1

Here is an illustration showcasing the calculation for the angle between two planes using PlaneHelper.

To determine the angle between the normals of the planes, you can obtain the normal vectors and use the formula normal1.angleTo(normal2).

If you are interested in finding the angle between the planes themselves, consider that the two planes along with their respective normals create a square. Since the normals are perpendicular to the planes, and the angle between them is known.

Hence, the angle between the planes can be calculated as 360 - (normal_angle + 180).

Note: When working with PlaneGeometry, you can construct your Plane by utilizing three points from the geometry like this:

const vertices = plane.geometry.attributes.position.array;
const plane1 = new THREE.Plane();
plane1.setFromCoplanarPoints(
     new THREE.Vector3(vertices[0], vertices[1], vertices[2]), 
     new THREE.Vector3(vertices[3], vertices[4], vertices[5]), 
     new THREE.Vector3(vertices[6], vertices[7], vertices[8])
);

            const scene = new THREE.Scene();
            const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );

            const renderer = new THREE.WebGLRenderer();
            renderer.setSize( window.innerWidth, window.innerHeight );
            document.body.appendChild( renderer.domElement );

            camera.position.z = 5;
      
      const plane1= new THREE.Plane( new THREE.Vector3( 1, 1, 0.2 ), 2 );
const helper = new THREE.PlaneHelper( plane1, 6, 0xffff00 );
scene.add( helper );

      const plane2= new THREE.Plane( new THREE.Vector3( -0.5, 0.2, 0.2 ), 2 );
const helper2 = new THREE.PlaneHelper( plane2, 6, 0xff00 );
scene.add( helper2 );

      const normal_angle_radians = plane1.normal.angleTo(plane2.normal);
      
      const normal_angle_degress = radians_to_degrees(normal_angle_radians);
      
      const angle_between_planes = 360 - normal_angle_degress - 180;
      
      alert('The degrees angle between planes is: '+ angle_between_planes);



            const animate = function () {
                requestAnimationFrame( animate );

                renderer.render( scene, camera );
            };
      
      function radians_to_degrees(radians)
{
  var pi = Math.PI;
  return radians * (180/pi);
}

            animate();
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>

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

Altering the color scheme of a specific column within a stacked bar chart using C3.js

I'm currently facing a challenge with highlighting specific values in a c3.js stacked bar chart. While I was able to change the color of an individual bar in a non-stacked bar following this example, I'm struggling to determine how to identify th ...

Blender 4 Web continues to use up CPU resources persistently, even after the webpage has finished loading

I have recently created a basic scene featuring a cube and a sphere in Blender. After exporting it as Blender 4 web JSON, I proceeded to build a simple webpage outlined below: index.html <!DOCTYPE html> <html> <head> <script src="b4w ...

Dismiss the Popover in Ionic 2

After opening a popover that redirects me to another page and then returning to the root page (popToRoot), I reload the data/dom upon an event and dismiss the popup once the json data is received from the server. Everything works smoothly with a lengthy ti ...

Creating a variable to store the data retrieved from a package

Imagine you have a functioning code snippet like this: const myPackage = require('myPackage'); myPackage.internal_func(parameter).then(console.log); This outputs a JSON object, for example: { x: 'valX', y: 'valY' } ...

The dot prefix on the cookie domain is causing issues with CORS requests

After my server authenticates a request, I send a response with an authentication token cookie set in the client's browser using the following header: Set-Cookie:mysite_auth=encodedJwtHere.JustPretend; SameSite=lax; domain=subdomain.mydomain.com; HTT ...

Exploring MongoDB's grouping capabilities with a touch of Lodash chain and groupBy

I have a lodash function that groups and returns an array like this [{ key: '00001', amount: 135, request: [ false, false ] }] I am looking for a way to check if the request contains any value using MongoDB aggregate. Currently, I can ...

Planning and organization of a Node.js/Express project

Having a background in MVC programming with frameworks like Laravel, CodeIgniter, and Django, I have now transitioned to working on larger projects in Node.js. However, I am struggling to find a suitable way to structure my project effectively... After so ...

Executing secure journey within TypeScript

Just came across an enlightening article on Medium by Gidi Meir Morris titled Utilizing ES6's Proxy for secure Object property access. The concept is intriguing and I decided to implement it in my Typescript project for handling optional nested object ...

Display loader until the document body has finished loading

Many developers have shared solutions for displaying a loader while an element is being loaded. However, my challenge is unique. I want to display a loader before the document body is fully loaded. The issue arises from an AJAX call in my code: var url = ...

Encountering a syntax error when utilizing a specific JavaScript method

I encountered an error while working on my JavaScript code. I am trying to prevent duplicate values using a method, but it is resulting in a syntax error. Let me explain the relevant part of the code below: var outputList = []; for (var i = 0; i < spec ...

Breaking apart paragraphs in a text using JavaScript

Hello, I am working on a code that is supposed to extract paragraphs from text entered into a textarea and create an array containing each paragraph. For example, it should turn text like this: Hello, that's the first paragraph Hello, that's th ...

Removing cookies after sending a beacon during the window unload event in Chrome

Here's the situation: I need to make sure that when the browser is closed or the tab is closed, the following steps are taken: Send a reliable post request to my server every time. After sending the request, delete the cookies using my synchronous fu ...

Is there a way to store an SQL query within a variable and then expand upon it?

While experimenting with potential SQL injections on my database, I've encountered an issue where a simple function returns results that a user should not have access to. The return value seems to be correct based on the id, but the rest of the query ...

Looking for assistance with removing hardcoding in HTML and jQuery?

Currently working on a biography page for my company's website that features a grid layout of the employees' profile pictures. Each picture should be clickable, causing the screen to fade to gray and display an overlay with the respective person& ...

Tips for generating JSON data in the correct format dynamically while continuously adding new information to the existing object

In my form, users input their email and password, which then generates dynamic JSON upon submission. However, I encountered an issue where the JSON gets corrupted when logging in with different user details as it updates the existing JSON with a new object ...

ReplaySubject in Angular is failing to update the array when a new object is added

I am encountering an issue where, upon attempting to create a new page Object, it successfully sends the data to the backend but does not update the array. I have to refresh the page in order to view the entire array. Within the frontend, I am utilizing O ...

Ensuring the absence of non-UTF8 characters in JavaScript

Seeking advice on creating a function in Javascript to determine if a string contains only UTF8 characters. The goal is to return true if the string has no non-UTF8 characters, and false if it does. No character replacement is needed, just a validation c ...

Fixed Container housing a Child Div with Scrollbar

I am faced with a challenge involving a lengthy navigation menu (.nav-main) nested within a fixed header (header). When the navigation menu is toggled using jQuery .toggle(), the content extends beyond the window height and does not scroll. I am looking fo ...

Utilizing various ExtJS selectors

Can Ext JS 4 support multiple selectors for event handling? I understand that in JQuery, you can achieve this by using the following syntax: $('.selector1,.selector2').click(function(){ //.. }); However, I attempted to use a similar method ...

JavaScript element styling in a Partial view, experiencing issues with functionality

In the main view, the javascript element is working fine. However, in the partial view it seems to not be functioning even though it is correctly formatted. Any ideas on how to fix this issue? Check out this fiddle for reference: http://jsfiddle.net/bgrin ...