2017-03-23 5 views
1

Ich brauche dringend Hilfe mit einem Abschluss-Projekt, an dem ich arbeite. Was ich hier im folgenden Code erreichen möchte, ist - um es ganz einfach zu sagen - ein 3d-Array von box() - Objekten zu initialisieren (das funktioniert) und dann ein anderes box() -Objekt einzuführen (das Endziel ist ein Array von diesen) sich innerhalb desselben 3D-Gitters zu bewegen. Die sich bewegende Einheit wählt einen zufälligen Ort für die Initialisierung und ein zufälliges Ziel für den Zielort aus (beide innerhalb des 3D-Gitters).
Aber das Problem ist, dass ich brauche, dass sich die bewegliche Einheit nicht mit den statischen Basiseinheiten überlappt, sich auch orthogonal bewegt und immer eine Einheitsgröße jedes Mal bewegt. Wenn ich den Code unten ausführe, erreicht die bewegliche Einheit das Ziel, aber ohne die oben erwähnten Einschränkungen. Es nimmt nur den kürzesten Vektor und geht dort unabhängig.3D-Array-Bewegung in p5.js?

PS: Da p5js Drahtgitter im Webgl-Modus nicht unterstützt, habe ich versucht, sie mit etwas Transparenz für bessere visuelle Lesbarkeit zu zeigen. Die loadImage() -Funktionen sind jedoch immer noch vorhanden und können durch ein beliebiges Bild ersetzt werden, um Einheiten besser voneinander zu unterscheiden.

Ich würde hochachtungsvoll Hilfe dabei schätzen, da ich auch sehr wenig Zeit habe. Danke im Voraus.

Hier ist der überprüfbare Code:

var matrixSize = 5; 
var locations = new Array(matrixSize); 
var locBool = new Array(matrixSize); 

//unit stuff 
var unitSize = 40; 
var units_a = [] 
var units_b; 

function setup() { 
    createCanvas(windowWidth, windowHeight, WEBGL); 

    //3D array of location vectors & booleans 
    for(var i = 0; i < locations.length; i++){ 
     locations[i] = new Array(matrixSize); 
     locBool[i] = new Array(matrixSize); 
     for(var j = 0; j < locations[i].length; j++){ 
      locations[i][j] = new Array(matrixSize); 
      locBool[i][j] = new Array(matrixSize); 
      for(var k = 0; k < locations[i][j].length; k++){ 
       locations[i][j][k] = 
       createVector(i*unitSize, j*unitSize, k*unitSize); 
       locBool[i][j][k] = false; 
      } 
     } 
    } 

    //base units 
    var threshold = 2; //decides on the percentage to be initialized 
    for (var i = 0; i < matrixSize; i++) { 
     for(var j = 0; j < matrixSize; j++){ 
      for(var k = 0; k < matrixSize; k++){ 
       stateRndm = random(10); 
       if(stateRndm <= threshold){ 
        state = 1; 
        locBool[i][j][k] = true; 
       }else{ 
        state = 0 
       } 
       units_a.push(new UnitOne(
        i*unitSize,j*unitSize,k*unitSize, state)); 
      } 
     } 
    } 
    units_b = new UnitTwo(); 
} 

function draw() { 
    background(20); 
    ambientLight(235); 
    orbitControl(); 
    rotateX(10); 
    rotateY(-10); 
    rotateZ(0); 

    //center the window and display the units 
    push(); 
    translate(-unitSize*matrixSize/2, -unitSize*matrixSize/2, 0); 
    for(var i = 0; i < units_a.length; i++){ 
     units_a[i].display(); 
    } 
    units_b.display(); 
    units_b.update(); 
    units_b.move(); 
    pop(); 
} 

function UnitOne (x, y, z, state){ 
    this.x = x; 
    this.y = y; 
    this.z = z; 
    this.state = state; 

    //this.img = loadImage("assets/tex_1.jpg"); 

    //basic movement parameters 
    this.acceleration = createVector(); 
    this.velocity = createVector(); 
    this.location = createVector(this.x, this.y, this.z); 


    this.update = function(){ 
     this.velocity.add(this.acceleration); 
     this.location.add(this.velocity); 
     this.acceleration.mult(0); 
    } 

    this.display = function(){ 
     if(this.state == 1){ 
      push(); 
      scale(1); 
      //texture(this.img); 
      ambientMaterial(50, 200, 100, 20); 
      translate(this.x, this.y, this.z); 
      box(unitSize); 
      pop(); 
     } 
    } 
} 

function UnitTwo() { 
    //assign random initial location 
    this.selector; 
    for(var i = 0; i < locations.length; i++){ 
     for(var j = 0; j < locations[i].length; j++){ 
      for(var k = 0; k < locations[i][j].length; k++){ 
       this.selector = createVector(
        floor(random(i))*unitSize, 
        floor(random(j))*unitSize, 
        floor(random(k))*unitSize); 
      } 
     } 
    } 
    print(this.selector); 

    //assign random target 
    this.targetSelector; 
    for(var i = 0; i < locations.length; i++){ 
     for(var j = 0; j < locations[i].length; j++){ 
      for(var k = 0; k < locations[i][j].length; k++){ 
       this.targetSelector = createVector(
        floor(random(i))*unitSize, 
        floor(random(j))*unitSize, 
        floor(random(k))*unitSize); 
      } 
     } 
    } 
    print(this.targetSelector); 

    //basic movement parameters 
    this.location = createVector(
        this.selector.x, 
        this.selector.y, 
        this.selector.z); 
    this.acceleration = createVector(); 
    this.velocity = createVector(); 

    this.maxSpeed = 1; 
    this.maxForce = 2; 

    //this.img = loadImage("assets/tex_2.jpg"); 

    this.display = function(){ 
     push(); 
     //texture(this.img); 
     ambientMaterial(200, 100, 40); 
     translate(this.location.x, 
       this.location.y, this.location.z); 
     scale(1); 
     box(unitSize); 
     pop(); 
    } 

    this.update = function(){ 
     this.velocity.add(this.acceleration); 
     this.location.add(this.velocity); 
     this.acceleration.mult(0); 
    } 
} 

UnitTwo.prototype.move = function(){ 
    var target = createVector(this.targetSelector.x, 
           this.targetSelector.y, 
           this.targetSelector.z); 
    var desired = p5.Vector.sub(target, this.location); 

    var d = desired.mag(); 

    //check the distance to slow down 
    if (d < unitSize/2) 
     desired.setMag(this.maxSpeed/2); 
    else 
     desired.setMag(this.maxSpeed); 

    var steer = p5.Vector.sub(desired, this.velocity); 
    steer.limit(this.maxForce); 
    this.acceleration.add(steer); 
} 

Antwort

0

Sie beiden Dinge, die Sie tun müssen, skizziert habe zu. Auf welchen Teil von denen steckst du?

Schritt 1: Lassen Sie Ihre Einheit einen Würfel nach dem anderen bewegen. Sie können dies tun, indem Sie einfach 1 zu seiner x-, y- oder z-Koordinate addieren oder subtrahieren. Lass das zuerst funktionieren. Mach dir keine Sorgen darüber, Kollisionen mit den anderen Würfeln zu vermeiden.

Schritt 2: Wenn Sie das schaffen, fügen Sie Code hinzu, der erkennt, wenn der Würfel, zu dem er sich bewegen soll, besetzt ist, und in eine andere Richtung geht. Möglicherweise müssen Sie einen grundlegenden Algorithmus zur Pfadfindung implementieren, und Google ist Ihr Freund dafür.

Sie sollten auch die Möglichkeit in Betracht ziehen, dass Ihre zufällige Generierung alle Pfade zum Ziel blockiert hat. Was möchten Sie in diesem Fall tun? Und noch eine Anmerkung: Sie brauchen keine dreifach verschachtelte for-Schleife, nur um einen zufälligen Wert zu generieren.

Wenn Sie bei einem dieser Schritte stecken bleiben, verengen Sie bitte Ihr Problem auf MCVE und zeigen Sie nur diesen Schritt, bevor Sie erneut posten. Viel Glück.