Moving units by vectors

wraithseeker

Tired.
Reaction score
122
So I have vector a which is x y z of initial unit position available and vector b x y z of final unit position available, how do I move them?
JASS:
// initial vector
set d.zx = GetUnitX(target) * Cos(angle)
        set d.zy = GetUnitY(target) * Sin(angle)
        call MoveLocation(L,d.x,d.y)
        set d.zz = GetLocationZ(L) // I am not using Z axis for now, ignore it same for the rest

JASS:
// speed vector

 set d.x = speed * Cos(angle) * TIME
        set d.y = speed * Sin(angle) * TIME
        set d.z = 0 * TIME

JASS:
//decrement vector

  set d.dx = decrement * Cos(angle) * TIME
        set d.dy = decrement * Sin(angle) * TIME
        set d.z = 0 * TIME


I am new to vectors so don't blame me for doing stupid stuff, this is deacclerating and not accelerating. They start from a variable of x speed and then x decrement and end at 0 speed.
 

phyrex1an

Staff Member and irregular helper
Reaction score
446
Current position: P
Speed: V
Acceleration (use negative signs for deacceleration...): A
V and A are already in the right unit of time (this is what you do when you have *TIME)

Each interval:
V = V+A ([de]accelerating)
P = P+V (updating unit position)

Typically the movement would end when |V|<=0 ("length of V is less than 0")
Adding two vectors together is the the same thing as adding their respective x, y and z values.
 

wraithseeker

Tired.
Reaction score
122
JASS:
  call MoveLocation(L,x,y)
        set d.position = vector.create(x,y,GetUnitFlyHeight(target)-GetLocationZ(L))
        set d.velocity = vector.create(x-GetUnitX(source),y- GetUnitY(source),120) // what should I input for the z axis of velocity?
        call d.velocity.setLength(speed*TIME)
        set d.acceleration = vector.create(d.velocity.x*-1,d.velocity.y*-1,GRAVITY) // GRAVITY = -981
        call d.acceleration.setLength(decrement*TIME)

    // periodic function
        set d.velocity.x = d.velocity.x+d.acceleration.x
        set d.velocity.y = d.velocity.y + d.acceleration.y // I know I could have added them together but I am doing some testing
        set d.velocity.z = d.velocity.z + d.acceleration.z
        set d.position.x = d.position.x + d.velocity.x
        set d.position.y = d.position.y + d.velocity.y
        call MoveLocation(L,d.position.x,d.position.y)
        set d.position.z = d.position.z + d.velocity.z
        set Height = GetLocationZ(L)
        call SetUnitX(d.target,d.position.x)
        call SetUnitY(d.target,d.position.y)
        call SetUnitFlyHeight(d.target,d.position.z-Height,0)


The jump doesn't function correctly, it stops earlier then it should have been and it normally doesn't come down.
 

phyrex1an

Staff Member and irregular helper
Reaction score
446
Where is your stop condition?
Since this is a jump the movement should stop when d.position.z-Height <= 0. (set the fly height to 0 when this happens)
A jump won't have a x and y deacceleration, unless you account for air resistance which seems very unneeded for a wc3 spell. The only force is the gravity (z).
 

wraithseeker

Tired.
Reaction score
122
A stop condition is when the dot product of velocity and acceleration vector >= 0 then destroy the struct.

Well but that will screw up my distance as the distance gets longer for that condition. The x and y deacceleration is the knockback deacceleration.
 

uberfoop

~=Admiral Stukov=~
Reaction score
177
You said your jump only goes up and not down, and stops early. Are you using the dot product of velocity and accelleration >= 0 for the z of the jump to determine when to stop? Because that will stop it halfway through.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top