Page 1 of 2 12 LastLast
Results 1 to 10 of 14

Thread: Rotation issue

  1. #1
    Sergeant serthy's Avatar
    Join Date
    Nov 2012
    Posts
    450
    Thanks
    96
    Thanked 296 Times in 188 Posts

    Rotation issue

    Hey,

    I aligned a model onto the ground and i can't figure out, how to rotate this model on its local axis a specific angle.Attachment 470
    For example how do i rotate the Block 90 on its yaw axis? ( 0 , 90 , 0 )

  2. #2
    Assadministrator IzNoGoD's Avatar
    Join Date
    Aug 2012
    Posts
    1,718
    Thanks
    17
    Thanked 1,068 Times in 674 Posts

  3. #3
    Sergeant serthy's Avatar
    Join Date
    Nov 2012
    Posts
    450
    Thanks
    96
    Thanked 296 Times in 188 Posts
    I would like to do it without matrices/quaternions, since its CoD2...

    I'll update later

  4. #4
    Sergeant serthy's Avatar
    Join Date
    Nov 2012
    Posts
    450
    Thanks
    96
    Thanked 296 Times in 188 Posts
    damnit, i tried shitload, but nothing seems to work -.-

    http://pastebin.com/cmGuVssn


    i wish i had sth like this finished yesterday, but nothing
    Code:
    doYawRotation( alignedAngles , desiredAngles )
    {
    	aF = anglesToForward( ( alignedAngles[0] , desiredAngles[1] , alignedAngles[2] ) );
    	aR = anglesToRight( ( alignedAngles[0] , desiredAngles[1] , alignedAngles[2] ) );
    
    	yaw = desiredAngles[1];
    	pitch = alignedAngles[0];
    	roll = alignedAngles[2];
    
    	return ( pitch , yaw , roll );
    }

  5. #5
    Sergeant serthy's Avatar
    Join Date
    Nov 2012
    Posts
    450
    Thanks
    96
    Thanked 296 Times in 188 Posts
    Iznogod helped me via xfire last eve.

    we broke it down to this:

    angles = vectorToAngles( playerForward - vectorScale( objectUp , vectorDot( objectUp , playerForward ) ) );

    since the vector's z-value returned by vectorToAngles() stays always at 0 the alignment is only on the horizontal plane.

    is there a way to recompute this missing roll-value?

  6. #6
    Assadministrator kung foo man's Avatar
    Join Date
    Jun 2012
    Location
    trailerpark
    Posts
    2,011
    Thanks
    2,102
    Thanked 1,084 Times in 753 Posts
    Just found this old function, don't remember where I initially found it:

    PHP Code:
    orientToNormalnormal )
    {
        
    hor_normal = ( normal], normal], );
        
    hor_length lengthhor_normal );

        if ( !
    hor_length )
            return( 
    00);

        
    hor_dir vectornormalizehor_normal );
        
    neg_height normal] * - 1;
        
    tangent = ( hor_dir] * neg_heighthor_dir] * neg_heighthor_length );
        
    plant_angle vectortoanglestangent );

        
    //println("^6hor_normal is ", hor_normal);
        //println("^6hor_length is ", hor_length);
        //println("^6hor_dir is ", hor_dir);
        //println("^6neg_height is ", neg_height);
        //println("^6tangent is ", tangent);
        //println("^6plant_angle is ", plant_angle);

        
    return plant_angle;

    Dunno which yaw angle it computes though
    timescale 0.01

  7. The Following User Says Thank You to kung foo man For This Useful Post:

    serthy (11th October 2013)

  8. #7
    Sergeant serthy's Avatar
    Join Date
    Nov 2012
    Posts
    450
    Thanks
    96
    Thanked 296 Times in 188 Posts
    goddamn i still fail on this... i got it to align it on 3 sides, but the fourth is still ... WRONG...

    code so far..:
    Code:
    a = vectorToAngles( vectorNormalize( playerForward - vectorScale( tankUp , vectorDot( tankUp , playerForward ) ) ) ); //this projects the playerForward to the tanks x/y-plane
    r = vectorToAngles( tankUp - towerUp );
    tower rotateTo( ( a[0] , a[1] , r[0] ) , 0.1, 0 , 0 );
    i dont get it... lol why only on 3 sides?!

    green: tank angles
    blue: tower angles
    pink: player forward
    yellow: projected player forward on tanks xy plane
    numbers: r[0]
    Attachment 478
    Last edited by serthy; 14th October 2013 at 22:20.

  9. #8
    Assadministrator kung foo man's Avatar
    Join Date
    Jun 2012
    Location
    trailerpark
    Posts
    2,011
    Thanks
    2,102
    Thanked 1,084 Times in 753 Posts
    Would like to try it out, but no git repository in sight ;P
    timescale 0.01

  10. #9
    Sergeant serthy's Avatar
    Join Date
    Nov 2012
    Posts
    450
    Thanks
    96
    Thanked 296 Times in 188 Posts
    ill release it asap

  11. #10
    Sergeant serthy's Avatar
    Join Date
    Nov 2012
    Posts
    450
    Thanks
    96
    Thanked 296 Times in 188 Posts
    Attachment 480
    i call it TANKTRESS ...
    call on map start before any wait statements:
    PHP Code:
    init()
    {
        
    level.killtube true;

        if( 
    level.killtube )
        {
            
    level.model_body[0] = "xmodel/furniture_bedmattress1";
            
    level.model_tower[0] = "xmodel/prop_barrel_benzin";
            
    level.model_gun[0] = "xmodel/weapon_30cal";
            
    level.model_track[0] = "xmodel/tag_origin";
            
    level.model_track_scroll[0] = "xmodel/tag_origin";
        }
        else
        {
            
    level.model_body[0] = "xmodel/serthy_tank_a_body";
            
    level.model_tower[0] = "xmodel/serthy_tank_a_tower";
            
    level.model_gun[0] = "xmodel/serthy_tank_a_gun";
            
    level.model_track[0] = "xmodel/serthy_tank_a_track";
            
    level.model_track_scroll[0] = "xmodel/serthy_tank_a_track_scroll";
        }

        
    precacheModellevel.model_body[0] );
        
    precacheModellevel.model_tower[0] );
        
    precacheModellevel.model_gun[0] );
        
    precacheModellevel.model_track[0] );
        
    precacheModellevel.model_track_scroll[0] );

        if( 
    level.killtube )
        {
            
    level.model_body[1] = "xmodel/furniture_bedmattress1";
            
    level.model_tower[1] = "xmodel/prop_barrel_benzin";
            
    level.model_gun[1] = "xmodel/weapon_30cal";
            
    level.model_track[1] = "xmodel/tag_origin";
            
    level.model_track_scroll[1] = "xmodel/tag_origin";
        }
        else
        {
            
    level.model_body[1] = "xmodel/serthy_tank_b_body";
            
    level.model_tower[1] = "xmodel/serthy_tank_b_tower";
            
    level.model_gun[1] = "xmodel/serthy_tank_b_gun";
            
    level.model_track[1] = "xmodel/serthy_tank_b_track";
            
    level.model_track_scroll[1] = "xmodel/serthy_tank_b_track_scroll";
        }

        
    precacheModellevel.model_body[1] );
        
    precacheModellevel.model_tower[1] );
        
    precacheModellevel.model_gun[1] );
        
    precacheModellevel.model_track[1] );
        
    precacheModellevel.model_track_scroll[1] );

        
    spawns getEntArray"mp_tdm_spawn" "classname" );

        for( 
    isDefinedspawns ) && spawns.size && 15 i++ )
        {
            
    level thread spawnTankspawns[i].origin );
        }
    }

    spawnTankpos )
    {
        
    wait1.0 );

        
    tank spawn"script_model" pos + ( ) );
        
    tank.body spawn"script_model" pos + ( ) );
        
    tank.tower spawn"script_model" pos + ( ) );
        
    tank.gun spawn"script_model" pos + ( 60 80 ) );

        if( 
    level.killtube )
            
    tank.gun.origin pos + ( 10 30 );

        
    tank.typeID randomInt);

        
    tank setModellevel.model_track[tank.typeID] );
        
    tank.body setModellevel.model_body[tank.typeID] );
        
    tank.tower setModellevel.model_tower[tank.typeID] );
        
    tank.gun setModellevel.model_gun[tank.typeID] );

        
    tank.gun linkTotank.tower );
        
        
    tank.vehicleType "tank";
        
    tank.targetname "vehicle";

        
    tank.speed 0;
        
    tank.maxSpeed 30;
        
    tank.minSpeed = -10;
        
    tank.gear 1;
        
    tank.maxHealth 200;
        
    tank.health tank.maxHealth;

        
    tank.anglesF anglesToForwardtank.angles );
        
    tank.anglesR anglesToRighttank.angles );
        
    tank.anglesU anglesToUptank.angles );

        
    tank thread tankTriggerLogic();
        
    tank thread tankLogic();
    }

    tankTriggerLogic()
    {
        
    trigger spawn"trigger_radius" self.origin 200 200 );
        
    trigger enableLinkTo();
        
    trigger linkToself );

        
    self.trigger trigger;
        
        
    trigger endon"death" );

        while( 
    isDefinedself ) )
        {
            
    trigger waittill"trigger" player );

            if( !
    isDefinedplayer ) || !isPlayerplayer ) || !isAliveplayer ) || !player useButtonPressed() )
                continue;
            else if( 
    isDefinedplayer.vehicle ) || isDefinedself.driver ) || isDefinedplayer.isBot ) )
                continue;

            
    self thread attachPlayerplayer );
        }

        
    trigger unLink();

        
    trigger notify"death" );

        
    wait0.05 );

        if( 
    isDefinedtrigger ) )
            
    trigger delete();
    }

    monitorPlayer()
    {
        
    self endon"disconenct" );
        
    self endon"exitVehicle" );

        
    self waittill"killed_player" );

        
    assertisDefinedself.vehicle ) );

        
    self.vehicle detachPlayerself );
    }

    attachPlayerplayer )
    {
        
    player endon"disconenct" );
        
    player endon"killed_player" );

        if( !
    isDefinedself.driver ) )
        {
            
    self.driver player;

            
    player setOriginself.origin + ( 70 ) );
            
    player linkToself );
            
    player disableWeapon();
            
    player.vehicle self;

            
    player hide();
            
    player setModel"" );

            
    player setClientCvar"cg_thirdperson" );
            
    player setClientCvar"cg_thirdpersonrange" 200 );
            
    player setClientCvar"cg_thirdpersonangle" );

            
    player thread monitorPlayer();
        }
        else
        {
            return 
    iPrintLn"Tank tried to attach player as driver while having a driver!" );
        }
    }

    detachPlayerplayer )
    {
        
    player endon"disconenct" );

        
    wait0.05 );

        
    player unlink();
        
    player enableWeapon();

        
    player setClientCvar"cg_thirdperson" );

        
    //if( isDefined( player.pers["savedmodel"] ) );
        //    player loadModel( player.pers["savedmodel"] );

        
    player.vehicle undefined;

        
    self.driver undefined;

        
    player notify"exitVehicle" );
    }

    checkCollissiontrace )
    {
        if( 
    trace["fraction"] == )
            return 
    false;

        if( 
    isDefinedtrace["entity"] ) )
        {
            if( 
    isPlayertrace["entity"] ) )
                
    trace["entity"suicide();

            return 
    false;
        }

        return 
    true;
    }

    vectorScale)
    {
        return ( 
    v[0] * v[1] * v[2] * );
    }

    tankLogic()
    {
        
    self endon"death" );
        
    self endon"destroyed" );

        
    speedTreshold 3;
        
    timeStep 0.1;

        for( 
    true i++ )
        {
            
    waittimeStep );

            
    self.anglesF anglesToForwardself.angles );
            
    self.anglesR anglesToRightself.angles );
            
    self.anglesU anglesToUpself.angles );

            
    self.nextAngles self.angles;

            
    buttonMelee false;
            
    buttonAttack false;
            
    buttonUse false;

            
    pitch undefined;

            
    desiredDir self.angles;

            if( !
    isDefinedself.driver ) )
            {
                if( 
    self.speed != )
                {
                    if( 
    self.speed )
                        
    self.speed -= 1;
                    else
                        
    self.speed += 1;
                }
            }
            else
            {
                
    buttonMelee self.driver meleeButtonPressed();
                
    buttonAttack self.driver attackButtonPressed();
                
    buttonUse self.driver useButtonPressed();

                if( 
    buttonMelee )
                {
                    if( 
    buttonUse )
                    {
                        if( 
    self.speed )
                        {
                            
    self.speed -= 6;

                            if( 
    self.speed )
                                
    self.speed 0;
                        }
                        else
                            
    self.speed -= 1;
                    }
                    else
                    {
                        
    self.speed += 2;
                    }
                }
                else
                {
                    if( 
    self.speed self.gear speedTreshold )
                        
    self.speed 0;
                    else
                        
    self.speed -= ( self.gear );
                }
            }

            if( 
    self.speed self.maxSpeed )
                
    self.speed self.maxSpeed;
            else if( 
    self.speed self.minSpeed )
                
    self.speed self.minSpeed;

            
    self.gear 1;

            if( 
    self.speed )
                
    self.gear = -1;

            if( ( 
    self.speed self.gear >= speedTreshold ) || buttonAttack && == )
            {
                
    vectorScaleself.anglesR 60 );
                
    vectorScaleself.anglesF 100 self.speed );
                
    vectorScaleself.anglesF , -70 );
                
    = ( 164 );

                
    flt bulletTraceself.origin self.origin false self );
                
    frt bulletTraceself.origin self.origin false self );
                
    bt bulletTraceself.origin self.origin false self );

                
    diff frt["position"] - flt["position"];
                
    nextPos flt["position"] + vectorScalediff 0.5 ) - vectorScaleself.anglesF 100 );

                
    playerDir self.driver getPlayerAngles();

                if( 
    buttonAttack )
                    
    desiredDir playerDir;

                
    yaw desiredDir[1] - self.angles[1];

                while( 
    yaw < -180 )
                    
    yaw += 360;
                while( 
    yaw 180 )
                    
    yaw -= 360;

                
    pitch vectorToAnglesflt["position"] + vectorScalediff 0.5 ) - bt["position"] );
                
    yaw self.angles[1] + ( yaw 15 180 );
                
    roll vectorToAnglesdiff );

                if( ( 
    self.speed self.gear >= speedTreshold ) || buttonAttack )
                {
                    
    self.nextAngles = ( pitch[0] , yaw roll[0] );
        
                    
    self rotateToself.nextAngles timeStep );
                    
    self.body rotateToself.nextAngles timeStep );
                
                    
    self moveTonextPos + ( ) , timeStep );
                    
    self.tower moveTonextPos + ( ) , timeStep );
                    
    self.body moveTonextPos + ( ) , timeStep );
                
                    if( 
    self.model != level.model_track_scroll[self.typeID] )
                        
    self setModellevel.model_track_scroll[self.typeID] );
                }
            }
            else
            {
                if( 
    self.model != level.model_track[self.typeID] )
                    
    self setModellevel.model_track[self.typeID] );
            }

            if( 
    isDefinedself.driver ) )
            {
                
    pa self.driver getPlayerAngles();
                
    pu anglesToUppa );
                
    pr anglesToRightpa );
                
    pf anglesToForwardpa );

                
    ta self.nextAngles;
                
    tu anglesToUpta );
                
    tr anglesToRightta );
                
    tf anglesToForwardta );

                
    sa self.tower.angles;
                
    su anglesToUpsa );
                
    sr anglesToRightsa );
                
    sf anglesToForwardsa );
            
                
    //project playerdir onto tanks xy plane
                //a = vectorToAngles( pf - vectorScale( tu , vectorDot( tu , pf ) ) );

                
    vectorDottu pf );

                
    sf;

                if( 
    0.98 && > -0.98 )
                    
    vectorNormalizepf vectorScaletu ) );

                
    dbgHeight 64;
                
    dbgLength 60;

                if( 
    level.killtube )
                {
                    
    dbgHeight 0;
                    
    dbgLength 30;
                }

                
    lineself.origin + ( dbgHeight ) , self.origin + ( dbgHeight ) + vectorScaledbgLength ) , ( ) );
                
    lineself.origin + ( dbgHeight ) , self.origin + ( dbgHeight ) + vectorScalepf dbgLength ) , ( ) );

                
    lineself.origin + ( dbgHeight ) , self.origin + ( dbgHeight ) + vectorScaletu dbgLength ) , ( ) );
                
    lineself.origin + ( dbgHeight ) , self.origin + ( dbgHeight ) + vectorScaletf dbgLength ) , ( ) );
                
    lineself.origin + ( dbgHeight ) , self.origin + ( dbgHeight ) + vectorScaletr dbgLength ) , ( ) );

                
    //line( self.origin + ( 0 , 0 , dbgHeight ) , self.origin + ( 0 , 0 , dbgHeight ) + vectorScale( tf , 0 - dbgLength ) , ( 0 , 1 , 0 ) );
                //line( self.origin + ( 0 , 0 , dbgHeight ) , self.origin + ( 0 , 0 , dbgHeight ) + vectorScale( tr , 0 - dbgLength ) , ( 0 , 1 , 0 ) );

                
    lineself.origin + ( dbgHeight ) , self.origin + ( dbgHeight ) + vectorScalesu dbgLength ) , ( ) );
                
    lineself.origin + ( dbgHeight ) , self.origin + ( dbgHeight ) + vectorScalesf dbgLength ) , ( ) );
                
    lineself.origin + ( dbgHeight ) , self.origin + ( dbgHeight ) + vectorScalesr dbgLength ) , ( ) );

                
    //line( self.origin + ( 0 , 0 , dbgHeight ) , self.origin + ( 0 , 0 , dbgHeight ) + vectorScale( sf , 0 - dbgLength ) , ( 0 , 0 , 1 ) );
                //line( self.origin + ( 0 , 0 , dbgHeight ) , self.origin + ( 0 , 0 , dbgHeight ) + vectorScale( sr , 0 - dbgLength ) , ( 0 , 0 , 1 ) );

                
    sa[2];

                if( 
    vectorDottu su ) < 0.999 )
                {
                    
    vectorToAnglesvectorNormalizetu su ) );
                    
    r[0];
                }

                while( 
    < -180 )
                    
    += 360;
                while( 
    180 )
                    
    -= 360;

                
    vectorToAngles);
                
    = ( a[0] , a[1] , );

                if( 
    == )
                    
    self.tower rotateTotimeStep );

            }
        }
    }

    sign)
    {
        if( 
    )
            return -
    1;

        return 
    1;
    }

    vectorcross(a,b)
    {
        return ( 
    a[1] * b[2] - b[1] * a[2] , a[2] * b[0] - b[2] * a[0] , a[0] * b[1] - b[0] * a[1] );
    }

    sqrt)
    {
        
    x;

        for( 
    abs) >= 0.001 = ( ( + ( ) ) / ) )
        {
            
    y;
        }

        return 
    y;
    }

    abs)
    {
        if( 
    )
            
    x;

        return 
    x;
    }

    aTan2y,x) {
         
    coeff_1 3.14159265359 4;
         
    coeff_2 coeff_1;
         
    abs_y abs(y);

        if (
    >= ) {
            
    = (abs_y) / (abs_y);
            
    angle coeff_1 coeff_1 r;
        } else {
            
    = (abs_y) / (abs_y x);
            
    angle coeff_2 coeff_1 r;
        }
        if(
    0)
            
    angle *= -1;

        return 
    angle;

    Hold [F] for to drive
    Hold [F + Melee] to break/ drive backwards
    Hold [Attack] to align the Tanktress to the current direction
    Last edited by serthy; 15th October 2013 at 18:02.

  12. The Following 3 Users Say Thank You to serthy For This Useful Post:

    kung foo man (18th October 2013),Ni3ls (19th October 2013),RobsoN (15th October 2013)

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •