Pregunta

He estado tratando de encontrar un ejemplo de prevención de colisiones que puedo adaptar y utilizar para un juego que estoy trabajando. Será utilizado para modelar los movimientos de un esquiador de árboles evitar en la colina. Estoy basando el movimiento fuera de Comportamientos de dirección para personajes autónomos y hay un montón de buenos ejemplos para la siguiente ruta de acceso y el flocado, pero no puedo encontrar ninguna buena para evitar colisiones. La naturaleza del sitio web del Código tenía tutoriales impresionantes para la dirección, pero parecía cubrir todo, pero obstáculo evitación.

I convierte el código de aquí pero doesn 't trabajo, así como debe ser, porque las colisiones se encuentran proyectando el centro de obstáculos en el vector de velocidad sin tener en cuenta cuando el centro de obstáculos puede estar fuera de los límites de la colisión, pero el círculo sigue chocando. Aquí está el código Adapté (escrito en el Procesamiento (basado en Java)).

// Method to update location
void update() {
  // Update velocity
  vel.add(acc);
  // Limit speed
  vel.limit(maxspeed);
  loc.add(vel);
  // Reset accelertion to 0 each cycle
  acc.mult(0);
}

void obstacleAvoid() {
  float checkLength = 30*vel.mag();
  PVector forward,diff,ray,projection,force;
  float dotProd,dis;
  forward = vel.get();
  forward.normalize();
  ray = forward.get();
  ray.mult(checkLength);
  for ( int i = 0; i < obs.size(); i++ ) {
    Obstacle ob = (Obstacle)obs.get(i);
    diff = ob.pos.get();
    diff.sub(loc);
    PVector temp2 = forward.get();
    temp2.mult(ob.r);
    diff.sub(temp2);
    dotProd = diff.dot(forward);
    if ( dotProd > 0 ) {
      projection = forward.get();
      projection.mult(dotProd);
      dis = PVector.dist(projection,diff);
      if ( (dis < (ob.r + r)) && (projection.mag() < ray.mag()) ) {
        ob.hit = true;
        force = forward.get();
        force.mult(maxforce);
        if ( sign(diff,vel) == -1 ) { //CCW
          force.set(force.y,-force.x,0);
        }
        else { //CW
          force.set(-force.y,force.x,0);
        }
        force.mult(1-(projection.mag())/ray.mag());
        force.limit(maxforce);
        acc.add(force);
      }
    }
  }  
}

Así que me ayude Me preguntaba si alguien sabía de ningún ejemplos completos de prevención de colisiones que siguen al Comportamientos de dirección para personajes autónomos manera de hacer las cosas mejor. Este sitio es el applet de ejemplo para el papel y es el ejemplo exacto Me gustaría podría ver el código para. Lamentablemente no existe un código para venir con él y traté descompilación, pero sólo mostró la clase principal, por lo que no era muy útil. Si alguien tiene el código para este ejemplo o algo semejante, y un tutorial, lo agradecería mucho.

¿Fue útil?

Solución

Craig Reynolds no puede liberar el código fuente de los applets que le interesa. Similares código fuente está disponible en C ++ en OpenSteer , que se mantiene por Reynolds. Cristiano Schnellhammer y Thomas Feilkas trabajado para ampliar el papel original de Reynolds. Su papel se traduce en Inglés y contiene una sección sobre la evasión de obstáculos. El código fuente para su trabajo está disponible en Java . Sin embargo, Creo que el código del Shiffman es un gran punto de partida , y suena como que está bastante cerca de lo que ya se quiere

Uno de mis primeros programas de procesamiento modificó el ejemplo Boids para simular un apocalipsis zombi. Triángulos perseguido círculos que fueron evitarlos. Cada sobreviviente controles realizados con otros zombies en su visión, y promedia los vectores de amenazas ubicación en una función, PVector panic(ArrayList infected). Después de eso, era una cuestión de ponderar el nuevo vector negativamente y añadirla a vector de la corriente del sobreviviente como cualquier otra fuerza. Algo así como:

void flock(ArrayList uninfected, ArrayList infected) {
  PVector sep = separate(uninfected);   // Separation
  PVector ali = align(uninfected);      // Alignment
  PVector coh = cohesion(uninfected);   // Cohesion
  PVector pan = panic(infected);        // Panic
  // Arbitrarily weight these forces
  sep.mult(4.0);
  ali.mult(1.0);
  coh.mult(2.0);
  pan.mult(-3.0);
  // Add the force vectors to acceleration
  acc.add(sep);
  acc.add(ali);
  acc.add(coh);
  acc.add(pan);
}

Si el esquiador está detectando con éxito los obstáculos, a continuación, la evasión es el problema. Adición de un peso más fuerte para el vector de evitación, aumentando el radio del esquiador puede 'ver' para interactuar con los objetos, o incluso la adición de un método para el objeto que devuelve la ubicación del punto más cercano al esquiador podrían resolver su problema. También puede añadir desaceleración basado en la distancia desde el esquiador al obstáculo más cercano frente a él.

Recuerde que incluso el applet estás en interés no evita perfectamente obstáculos. Mi solución puede no ser exactamente lo que está sucediendo en el applet, sino por jugar con las fuerzas que determinar la dirección del esquiador, se puede lograr un efecto muy similar (y posiblemente mejor).

Otros consejos

Pedido este enlace en NEHE sitio de desarrollo de juegos:

  

En este tutorial aprenderá el   fundamentos de la detección de colisiones,   respuesta de colisión, y físicamente   efectos de modelado basado. este tutorial   se concentra más en la forma de colisión   detección funciona que en el actual   código, a pesar de todas las importantes   código se explica.

http://nehe.gamedev.net/data/lessons/ lesson.asp? lección = 30

Se realiza usando C ++ y API Win32. Aunque encontrará un enlace para Puerto de Java utilizando JOGL.

también El código fuente de http://www.red3d.com/cwr/steer/ está disponible aquí http://opensteer.sourceforge.net/ aunque en C ++. ¿Ha comprobado que ??

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top