Three.js: ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ 3D-ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΈΠ· 2-ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 1 июл. 2011  Β·  6ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: mrdoob/three.js

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, рСбята

Π― Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ я ΠΌΠΎΠ³Ρƒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ 3D-ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΡ‹ΡˆΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ столкновСния 2d
ΠΈΠ· этого ΠΊΠΎΠ΄Π°

function onDocumentMouseDown( event ) {
   event.preventDefault();
   mouse2d.x = ( event.clientX / window.innerWidth ) * 2 - 1;
   mouse2d.y = - ( event.clientY  / window.innerHeight ) * 2 + 1;
   mouse2d.z = 1;

   var r = new THREE.Ray();
   r.origin.copy( mouse2d );
   var matrix = camera.matrixWorld.clone();
   matrix.multiplySelf( THREE.Matrix4.makeInvert( camera.projectionMatrix ) );
   matrix.multiplyVector3( r.origin );
   r.direction = r.origin.clone().subSelf( camera.position );
   var c = THREE.Collisions.rayCastNearest( r );
   if( c ) {
//////////////////HERE GET THE 3D POINT COORDINATES////////////////////////
      c.mesh.materials[ 0 ].color.setHex( 0xaa0000 );
   } else {
      plane.materials[0].color.setHex( 0xF9EFD7 );
   }
};

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ столкновСния - это ΠΏΠ»ΠΎΡΠΊΠΎΡΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Π² качСствС Π·Π΅ΠΌΠ»ΠΈ, ΠΈ я Ρ…ΠΎΡ‡Ρƒ Π·Π½Π°Ρ‚ΡŒ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ‚ΠΎΡ‡ΠΊΠΈ столкновСния Π² 3D, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.
Π·Π°Ρ€Π°Π½Π΅Π΅ спасибо

ВсС 6 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

НСваТно, нашСл это

Как Π²Ρ‹ Π² ΠΈΡ‚ΠΎΠ³Π΅ это сдСлали?

Π£ мСня сама эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. МСня Π΄Π°ΠΆΠ΅ Π½Π΅ ΡƒΠ΄Π°Ρ€ΠΈΠ» ΠΊΠΎΠ»Π»Π°ΠΉΠ΄Π΅Ρ€. Как Π²Ρ‹ Π΅Π΅ Ρ€Π΅ΡˆΠΈΠ»ΠΈ?

@inear : Π²Ρ‹ ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π»ΠΈ с классом Ray ?

Благодаря! Π­Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ ΡˆΠ°Ρ€ΠΌ. Π’ΠΎΡ‡Π΅Ρ‡Π½ΠΎΠ΅ свойство ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ.

var vector = mouse2D;
projector.unprojectVector( vector, camera );
var r = new THREE.Ray(camera.position, vector.subSelf(camera.position).normalize());
var c = r.intersectObject(wave)
if( c.length > 0 ) {
   sphere.position = c[0].point;
}
var getZvalue = function (e)
{
    var rect = e.target.getBoundingClientRect();
    // 2D
    var mouseX = e.clientX - rect.left;
    var mouseY = e.clientY - rect.top;

    // 3D
    SCREEN_WIDTH = window.innerWidth;
    SCREEN_HEIGHT= window.innerHeight;
    var mouse = new THREE.Vector2();
    mouse.x = (mouseX/SCREEN_WIDTH) *2 - 1;
    mouse.y = -(mouseY/SCREEN_HEIGHT) *2 + 1;

    // Raycaster
    if (TerraDroneViewer.raycaster == null)
    {
        TerraDroneViewer.raycaster = new THREE.Raycaster();
    }

    TerraDroneViewer.raycaster.setFromCamera( mouse, TerraDroneViewer.camera );

    var intersects = TerraDroneViewer.raycaster.intersectObjects( TerraDroneViewer.maps.children );
    console.log("raycast=" + intersects.length);

    if (intersects.length != 0)
    {
        var x = mouse.x * 10;
        var y = mouse.y * 10;
        console.log("x = " + intersects[0].point.x + " y = " + intersects[0].point.y);
        var z = parseFloat(intersects[0].point.z) * 10;

        return {
                     x: x,
                     y: y,
                     z: z
                }
    }

        return null;
};
Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ