2016-08-26 13 views
0

3Dモデルでこのモデルを作成すると、100フレーム後にモデルが変形し始めます。マウスで移動するボックスの形をしています。それらの位置を元の位置にリセットし、モデルを再構築し、他のモデルは崩壊する。彼らがボックスに入っているときは常に位置をリセットし、そうでないときには移動してください。誰でも助けてください。今までのところ、頂点がボックス内にあるときには移動を止めます。アドバンス処理2,2,1 java。 3Dモデルの場合、位置をリセットします

import peasy.*; 
import saito.objloader.*; 


OBJModel model ; 
OBJModel tmpmodel ; 

PeasyCam cam; 

float easing = 0.005; 
float r; 
float k =0.00001; 
int VertCount; 
PVector[] Verts; 
PVector Mouse; 

void setup() 
{ 
    size(800, 800, P3D); 
    frameRate(30); 
    noStroke(); 

    model = new OBJModel(this, "Model2.obj", "absolute", TRIANGLES); 
    model.enableDebug(); 
    model.scale(100); 
    model.translateToCenter(); 

    tmpmodel = new OBJModel(this, "Model2.obj", "absolute", TRIANGLES); 
    tmpmodel.enableDebug(); 
    tmpmodel.scale(100); 
    tmpmodel.translateToCenter(); 



    cam = new PeasyCam(this, width/2, height/2, 0, 994); 
} 



void draw() 
{ 
    background(129); 
    lights(); 

    int VertCount = model.getVertexCount(); 
    PVector[] Verts = new PVector[VertCount]; 
    PVector[] locas = new PVector[VertCount]; 
    float r =80; 
    PVector Mouse = new PVector(mouseX-width/2, mouseY-height/2, 0); 


    cam.setMouseControlled(true); 










    //println(frameCount); 
    pushMatrix(); 
    translate(width/2, height/2, 0); 



    for (int i = 0; i < VertCount; i++) { 
    //PVector orgv = model.getVertex(i); 


    Verts[i]= model.getVertex(i); 
    arrayCopy(Verts, locas); 
    //PVector tmpv = new PVector(); 
    if (frameCount> 100) { 



     float randX = random(-5, 5); 
     float randY = random(-5, 5); 
     float randZ = random(-5, 5); 

     PVector Ran = new PVector(randX, randY, randZ); 

     //float norX = abs(cos(k)) * randX; 
     //float norY = abs(cos(k)) * randY; 
     //float norZ = abs(cos(k)) * randZ; 









     if (Verts[i].x > Mouse.x - r/2 && Verts[i].x < Mouse.x + r/2) { 
     if (Verts[i].x > Mouse.y - r/2 && Verts[i].x < Mouse.y + r/2) { 
      if (Verts[i].x > Mouse.z - r/2 && Verts[i].x < Mouse.z + r/2) { 


      arrayCopy(locas, Verts); 
      } 
     } 
     } else { 


     Verts[i].x+=Ran.x; 
     Verts[i].y+=Ran.y; 
     Verts[i].z+=Ran.z; 

     if (Verts[i].x > width/2 || Verts[i].x < -width/2) { 
      Verts[i].x+=-Ran.x; 
     } 
     if (Verts[i].y > height/2 || Verts[i].y < -height/2) { 
      Verts[i].y+=-Ran.y; 
     } 
     if (Verts[i].z < -800/2 || Verts[i].z > 800/2) { 
      Verts[i].z+=-Ran.z; 
     } 
     } 
     tmpmodel.setVertex(i, Verts[i].x, Verts[i].y, Verts[i].z); 
    } 
    k+=0.0001; 
    } 

    pushMatrix(); 
    translate(Mouse.x, Mouse.y, Mouse.z); 
    noFill(); 
    stroke(255); 
    box(r); 
    popMatrix(); 


    noStroke(); 

    tmpmodel.draw(); 

    popMatrix(); 



    pushMatrix(); 
    translate(width/2, height/2, 0); 
    noFill(); 
    stroke(255); 
    box(width, height, 600); 
    popMatrix(); 
} 

おかげで、あなたはそれが斎藤OBJ例やPshapeObjの例からモデルを使い実行したい場合。

+0

saitoライブラリはどこにありますか? [彼らのホームページ](https://code.google.com/p/saitoobjloade/)が壊れているようだ。いずれにせよ、それを取り除き、ライブラリを使用しない[mcve]を投稿できますか? –

答えて

0

コードには意味がない(いくつかのコメントが参考になるかもしれません)いくつかのことがあります。なぜあなたはそのような配列をコピーしていますか?

いずれにしても、私があなたであれば簡単に始めるでしょう。私はオブジェクト指向のアプローチを採用します。ここでは、ポイントの元の位置とその現在の位置をカプセル化するクラスを作成します。

は、ここでは、2つの次元でこれを行い例ですが、このアプローチは、3次元に一般化:

ArrayList<MovingPoint> points = new ArrayList<MovingPoint>(); 
float circleDiameter = 200; 

void setup(){ 

    size(500, 500); 

    for(int i = 0; i < 100; i++){ 
    points.add(new MovingPoint()); 
    } 
} 


void draw(){ 

    background(0); 

    noFill(); 
    stroke(255, 0, 0); 
    ellipse(mouseX, mouseY, circleDiameter, circleDiameter); 

    fill(255); 
    stroke(255); 

    MovingPoint previousPoint = null; 

    for(MovingPoint mp : points){ 

    mp.draw(); 

    if(previousPoint != null){ 
     line(previousPoint.current.x, previousPoint.current.y, mp.current.x, mp.current.y); 
    } 

    previousPoint = mp; 
    } 
} 

class MovingPoint{ 
    PVector original; 
    PVector current; 

    public MovingPoint(){ 
    original = new PVector(random(width), random(height)); 
    current = original.copy(); 
    } 

    void draw(){ 

    if(dist(current.x, current.y, mouseX, mouseY) < circleDiameter/2){ 
    //inside circle, reset position 
    current = original.copy(); 
    } 
    else{ 
     //outside circle, move randomly 
     current.x += random(-5, 5); 
     current.y += random(-5, 5); 
    } 

    ellipse(current.x, current.y, 10, 10); 
    } 
} 

あなたはコピーアレイのrigmaroleを通過する必要はありません。各点の元の位置と現在の位置を記憶しているクラスを使用して、マウスの位置に応じて切り替えます。

まだ動作しない場合は、スケッチ全体ではなく、この例で動作する別の質問を投稿してください。使用しているライブラリにアクセスできない場合は、手伝ってもらえません。そのため、ライブラリを削除し、問題をできるだけ少なくする方がよいでしょう。がんばろう。

関連する問題