Directional helix dla pocisków gier

głosy
0

moja matematyka isnt zbyt wielki, ale im próbuje dowiedzieć się, chociaż ..

Co im staramy się robić to dać moich gier pocisków rakietowych efekt spirali, ale nie wiem, jak pracować grzechu i cos aby spirala grać w dobrym kierunku ..

Jest to gra 3D przy okazji:

Problemem jest to, w zależności od kierunku twarze pocisk, spirala wygląda wypaczone lub mieszkania ..

Co najlepszym sposobem matematycznie obliczyć helisę opartą na pociski X, Y, Z / kierunek ?, ive próbuje zrozumieć to przez długi czas: /

Wielkie dzięki!

            double x = radius * Math.cos(theta);
            double y = radius * Math.sin(theta);
            double z = radius * Math.cos(theta);
            location.add(x,y,z);
            missile.shootFlame(location,2);
            location.subtract(x,y,z);

Utwórz 13/12/2016 o 07:19
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
1

wektorów bazowych

trzeba ogólny kierunek pocisku jako 3D vector niech nazwać W. Od niego trzeba dostać 2 kolejne wektory U,V, które są wszystkie do siebie prostopadłe. Aby dostać je można wykorzystać przekrój produkt. Więc:

  1. dokonać Wwektor jednostkowy

    Właśnie W = W/|W|tak:

    l=sqrt(Wx*Wx+Wy*Wy+Wz*Wz);
    Wx/=l;
    Wy/=l;
    Wz/=l;
    
  2. wybierać Ujako dowolny kierunek nierównolegleW

    więc zacząć U=(1.0,0.0,0.0)i czy U==Wwybrać U=(0.0,1.0,0.0). Jeśli masz coś do zablokowania aby użyć jej jako kierunku U więc układ współrzędnych nie obraca się wraz z upływem czasu (jak Up, North, Sun ...)

    UUrządzenie powinno być tak, jeśli nie normalizować je tak jak w # 1

  3. obliczać V

    Powinna ona być prostopadła do U,Wtak użyciu iloczynu:

    V = W x U
    

    Iloczynu wektorów jednostkowych jest również wektor jednostkowy więc nie ma potrzeby, aby unormować.

  4. Recompute U

    Jak wybrać Uręcznie musimy upewnić się, że jest prostopadła do V,Wtak:

    U = V x W
    

Teraz trzeba 3 prostopadłych kierunków podstawę, która U,Vleży w płaszczyźnie śrub spiralnym Wjest ogólny kierunek ruchu.

Jeśli nie wiesz jak obliczyć przekrój Zobacz produkt:

Teraz Helix jest prosta:

  1. definiuje

    więc mamy U,V,Wna górze, że musimy promień r [units], prędkość ruchu v [units/s], prędkości kątowej o [rad/s]czasu t>=0.0 [s]i pozycji startowej P0.

  2. równanie Helix

    To czego potrzebujemy to równanie powrocie aktualną pozycję na czasie więc:

    ang = o*t;
    P(t) = P0 + U*r*cos(ang) + V*r*sin(ang) + W*v*t;
    

    przepisany do skalarów:

    ang = o*t;
    x = P0x + Ux*r*cos(ang) + Vx*r*sin(ang) + Wx*v*t;
    y = P0y + Uy*r*cos(ang) + Vy*r*sin(ang) + Wy*v*t;
    z = P0z + Uz*r*cos(ang) + Vz*r*sin(ang) + Wz*v*t;
    

[Edit1] jak jesteś niekompetentny skopiować i pasty lub zmieniając mój kod poprawnie ...

Vector w = loc.getDirection();

double wX = w.getX();
double wY = w.getY();
double wZ = w.getZ();
double l = Math.sqrt((wX * wX) + (wY * wY) + (wZ * wZ));
wX = wX / l;
wY = wY / l;
wZ = wZ / l;
w = new Vector(wX,wY,wZ); // you forget to change W and use it latter ...

Vector u = new Vector(0, 1.0, 0);  
if (Math.abs(wX)<1e-3) // if U and W are the same chose different U
 if (Math.abs(wZ)<1e-3)
  u = new Vector(1.0, 0.0, 0);

Vector v = w.crossProduct(u);
u = v.crossProduct(w);

double radius = 10; // helix radius [units]
double speed = 2.00; // movement speed [unit/s]
double omega = 0.628; // angular speed [rad/s]
//double omega = 36.0; // angular speed [deg/s]
for (double i = 0; i < 100; i += 1.0) // time [s]
 {
 double angle = omega * i; // actual screw position [rad] or [deg]
 double x = u.getX() * radius * Math.cos(angle) + v.getX() * radius * Math.sin(angle) + wX * speed * i;
 double y = u.getY() * radius * Math.cos(angle) + v.getY() * radius * Math.sin(angle) + wY * speed * i;
 double z = u.getZ() * radius * Math.cos(angle) + v.getZ() * radius * Math.sin(angle) + wZ * speed * i;
 loc.add(x,y,z); // What is this? should not you set the x,y,z instead of adding?
 //do work
 loc.subtract(x,y,z); // what is this?
 }

To powinno zapewnić Państwu punktów helisy z przebytej odległości liniowej

speed*imax = 2.0*100.0 = 200.0 units 

I śruby:

omega*imax/(2*Pi) ~= 0.628*100.0/6.28 ~= 10 screws // in case of sin,cos want [rad]
omega*imax/360.0 = 36.0*100.0/360 = 10.0 screws // in case of sin,cos want [deg]

Nie zapomnij rem in / out poprawną omegalinię (wybiorę [rad] jak to co ja jestem przyzwyczajony, że moje libs matematyczne używać). Nie jestem pewien, czy tłumaczone do środowiska nie może być prawidłowo błędy jak absma inną nazwę lub u = new Vector(1.0, 0.0, 0);mogą być wykonane na pośredni lub deklaracji zmiennej tylko etc, które nie wiem, bo nie kod w nim.

Odpowiedział 13/12/2016 o 08:55
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more