示例#1
0
 public PlaneBody( Vector3f normal, float distanceToOrigin )
     : this(new Plane3f( normal, distanceToOrigin ))
 {
 }
示例#2
0
 public Vector3f getDisplacement ( Vector3f target ) {
     return new Vector3f( target.X - TranslationX, target.Y - TranslationY, target.Z - TranslationZ );
 }
示例#3
0
 public float translationDistance ( Vector3f v ) {
     return Vector3f.distance(
         TranslationX, TranslationY, TranslationZ,
         v.X, v.Y, v.Z
     );
 }
示例#4
0
 public void applyImpulse( Vector3f impulse )
 {
     velocity.add( impulse.getScaled( 1 / Mass ) );
 }
示例#5
0
 protected internal Vector3f getForce()
 {
     Vector3f v3f = new Vector3f( Acceleration );
     v3f.scale( Mass );
     return v3f;
 }
示例#6
0
 public Vector3f cross( Vector3f vector )
 {
     return new Vector3f( cross( data, vector.data ) );
 }
示例#7
0
 public void applyForce( Vector3f force )
 {
     acceleration.add( force.getScaled( 1 / Mass ) );
 }
示例#8
0
 public Vector3f( Vector3f vector )
     : base(vector)
 {
 }
示例#9
0
 public Vector3f getNormal( Vector3f v1, Vector3f v2 )
 {
     return new Vector3f( getNormal( data, v1.data, v2.data ) );
 }
示例#10
0
        protected override void OnLoad( System.EventArgs e )
        {
            lastMouseState = OpenTK.Input.Mouse.GetState();

            Texture angrySquirrelTexture, angryTurtleTexture, angryDilloTexture;
            Texture[] worldTextures;
            Mesh squirrelMesh, turtleMesh, dilloMesh;
            RectangleMesh[] worldMeshes;

            float aspectRatio = ClientSize.Width / (float) ( ClientSize.Height );

            projectionMatrix.set( Matrix4.CreatePerspectiveFieldOfView( (float) Math.PI / 4, aspectRatio, 1, 1000 ) );

            cameraOnFrame = delegate( Matrix4f mvMatrix ) {
                float radius = 40, y = 20, timeRatio = 0.5f;
                Vector3 pos = new Vector3(
                                  (float) Math.Sin( time.Value * timeRatio ) * radius,
                                  y,
                                  (float) Math.Cos( time.Value * timeRatio ) * radius );
                mvMatrix.set( Matrix4.LookAt( pos, new Vector3( 0, y * 0.5f * ( 1.5f + (float) Math.Sin( time.Value * timeRatio ) ), 0 ), new Vector3( 0, 1, 0 ) ) );
            };
            cameraOnFrame( modelviewMatrix );
            cameraOnFrame = null; // enable/disable

            ambientColor.set( 0.4f, 0.4f, 0.4f );
            lightColor.set( 1.0f, 1.0f, 1.0f );
            lightDirUnit.set( 0.5f, 1.0f, 0.5f );
            //lightDirUnit.set( 0.1f, 5.0f, 0.1f );
            lightDirUnit.normalize();
            //texture = new Texture( "E:\\drop\\logo-dark.jpg" );
            angrySquirrelTexture = new Texture( "gfx/angry-squirrel.png" );
            angryTurtleTexture = new Texture( "gfx/angry-turtle.png" );
            angryDilloTexture = new Texture( "gfx/angry-armadillo.png" );

            worldTextures = new Texture[] {
                new Texture( "gfx/drzewka-1.png" ),
                new Texture( "gfx/drzewka-3.png" ),
                new Texture( "gfx/sky.png" ),
                new Texture( "gfx/grass.png" ),
                new Texture( "gfx/drzewka-2.png" ),
                new Texture( "gfx/drzewka-4.png" )
            };

            CreateShaders();

            squirrelMesh = new SphereMesh( BALL_RADIUS, 20, 20, true );
            squirrelMesh.Texture = angrySquirrelTexture;
            /*
            squirrelMesh.UpdateAction = delegate( Mesh model ) {
                Matrix4f transform = model.Transform;
                transform.setScaleAndRotation( Matrix4.CreateRotationZ( time.Value ) );
                //transform.setTranslationY( BALL_RADIUS + JUMP_HEIGHT * 0.5f * (1 + (float) Math.Sin( time.Value )) ); // hover
                //transform.setTranslationY( BALL_RADIUS + JUMP_HEIGHT * (float) Math.Abs( Math.Sin( time.Value ) ) ); // hover
            };
            squirrelMesh.UpdateAction( squirrelMesh );
            */
            //sm.writeOBJ();
            meshes.Add( squirrelMesh );

            turtleMesh = new SphereMesh( BALL_RADIUS * 5, 10, 10, true );
            turtleMesh.Texture = angryTurtleTexture;
            /*
            turtleMesh.UpdateAction = delegate( Mesh model ) {
                Matrix4f transform = model.Transform;
                transform.setScaleAndRotation( Matrix4.CreateRotationX( -time.Value ) );
            };
            turtleMesh.UpdateAction( turtleMesh );
            */
            meshes.Add( turtleMesh );

            dilloMesh = new SphereMesh( BALL_RADIUS * 2, 20, 20, true );
            dilloMesh.Texture = angryDilloTexture;
            /*
            dilloMesh.UpdateAction = delegate( Mesh model ) {
                Matrix4f transform = model.Transform;
                transform.setScaleAndRotation( Matrix4.CreateRotationX( -time.Value ) );
            };
            dilloMesh.UpdateAction( dilloMesh );
            */
            meshes.Add( dilloMesh );

            float boxX = 100, boxY = 50, boxZ = 100, shiftX = 0.5f * boxX, shiftY = 0.5f * boxY, shiftZ = 0.5f * boxZ;
            worldMeshes = new RectangleMesh[] {
                new RectangleMesh( Vector3f.OZ, boxX, boxY ),
                new RectangleMesh( Vector3f.OZ, boxX, -boxY ),
                new RectangleMesh( Vector3f.OY, boxX, boxZ ),
                new RectangleMesh( Vector3f.OY, -boxX, boxZ ),
                new RectangleMesh( Vector3f.OZ, -boxX, boxY ),
                new RectangleMesh( Vector3f.OZ, boxX, boxY )
            };
            for ( int i = worldMeshes.Length - 1; i >= 0; i-- ) {
                Mesh m = worldMeshes[i];
                m.Texture = worldTextures[i];
                meshes.Add( m );
            }
            Matrix4f trans;
            trans = worldMeshes[0].Transform;
            trans.setZero();
            trans.Data[2] = 1;
            trans.Data[5] = 1;
            trans.Data[8] = 1;
            trans.Data[15] = 1;
            trans.setTranslation( shiftX, shiftY, 0 );
            trans = worldMeshes[1].Transform;
            trans.setZero();
            trans.Data[2] = -1;
            trans.Data[5] = -1;
            trans.Data[8] = -1;
            trans.Data[15] = 1;
            worldMeshes[1].Transform.setTranslation( -shiftX, shiftY, 0 );
            worldMeshes[2].Transform.setTranslation( 0, boxY, 0 );
            worldMeshes[3].Transform.setTranslation( 0, 0, 0 );
            worldMeshes[4].Transform.setTranslation( 0, shiftY, shiftZ );
            worldMeshes[5].Transform.setTranslation( 0, shiftY, -shiftZ );

            foreach ( Mesh m in meshes ) {
                m.init();
            }

            //bodyManager.Gravity.setZero();
            /*SphereBody*/
            squirrelBody = new SphereBody( 1, BALL_RADIUS );
            squirrelBody.Transform.setTranslation( 40, 40, 40 );
            squirrelBody.RotationSpeed = 1f;
            /*SphereBody*/
            turtleBody = new SphereBody( 25, BALL_RADIUS * 5 );
            turtleBody.Transform.setTranslation( 0, 20, 0 );
            //turtleBody.Velocity.Y = 5;
            turtleBody.RotationSpeed = 1f;
            /*SphereBody*/
            dilloBody = new SphereBody( 25, BALL_RADIUS * 2 );
            //dilloBody.Transform.setTranslation( -20, 100, -30 );
            dilloBody.Transform.setTranslation( 0, 30, 0 );
            //dilloBody.Velocity.Y = -5;
            dilloBody.RotationSpeed = 1f;
            Vector3f fixPoint = new Vector3f( 0, 42, 9 );
            /*
             // spring - vertical harmonic oscillator
            dilloBody.Forces.Add( delegate( Body obj ) {
                Vector3f disp = obj.Transform.getDisplacement( fixPoint );
                float k = 20.0f;
                disp.scale( k );
                obj.applyForce( disp );
            } );
            */

            // springy pendulum - 3D harmonic oscillator
            dilloBody.Forces.Add( delegate( Body obj ) {
                Vector3f disp = obj.Transform.getDisplacement( fixPoint );
                float k = 10.0f, l = 15.0f;
                disp.scale( k * ( disp.length() - l ) );
                obj.applyForce( disp );
            } );

            planeBodies = new PlaneBody[] {
                new PlaneBody( new Plane3f( new Vector3f( 0, 1, 0 ), 0 ) ),
                new PlaneBody( new Plane3f( new Vector3f( 0, -1, 0 ), boxY ) ),
                new PlaneBody( new Plane3f( new Vector3f( 1, 0, 0 ), shiftX ) ),
                new PlaneBody( new Plane3f( new Vector3f( -1, 0, 0 ), shiftX ) ),
                new PlaneBody( new Plane3f( new Vector3f( 0, 0, 1 ), shiftZ ) ),
                new PlaneBody( new Plane3f( new Vector3f( 0, 0, -1 ), shiftZ ) )
            };

            foreach ( PlaneBody pb in planeBodies ) {
                pb.Friction = 0.1f;
                bodyManager.addBody( pb );
            }
            bodyManager.addBody( squirrelBody, squirrelMesh );
            bodyManager.addBody( turtleBody, turtleMesh );
            bodyManager.addBody( dilloBody, dilloMesh );

            VSync = VSyncMode.On;
        }
示例#11
0
 public float getDistance( Vector3f point )
 {
     return Normal.dot( point ) + DistanceToOrigin;
 }
示例#12
0
 public Plane3f( Vector3f normal, float distanceToOrigin )
 {
     Normal = normal;
     DistanceToOrigin = distanceToOrigin;
 }