【问题标题】:Shape object in Processing, translate individual shapes处理中的形状对象,翻译单个形状
【发布时间】:2016-05-12 01:32:01
【问题描述】:

我在使用对象的 translate() 函数以及处理中的一般对象时遇到困难。我浏览了这些示例并尝试复制它们实例化对象的方式,但似乎甚至无法让形状出现在屏幕上,也不能移动它们。我使用嵌套的 for 循环将对象实例化为一个数组,并期望渲染一个对象网格。但是,什么都没有渲染。

我用于实例化图块的嵌套 for 循环结构:

for(int i=0; i<102; i++){
   for(int j=0; j<102; j++){
      tiles[i][j]=new tile(i,0,j);
      tiles[i][j].display();
   }
}

还有 tile 类的构造函数:

tile(int x, int y, int z){
this.x=x;
this.y=y;
this.z=z;
beginShape();
 vertex(x,y,z);
 vertex(x+1,y,z);
 vertex(x+1,y,z-1);
 vertex(x,y,z-1);
endShape();
}

运行时根本没有渲染任何内容。此外,如果有任何问题,我的翻译(移动)是在我为名为 move 的 tile 类编写的方法中完成的,该方法仅调用 translate。这是正确的方法吗?应该如何解决这个问题?我似乎完全不明白如何渲染/创建/翻译单个对象/形状。

【问题讨论】:

    标签: opengl 3d processing


    【解决方案1】:

    如果您使用beginShape(),则转换(例如平移、旋转等)不起作用,因为您只是指定要绘制的直接坐标。如果您依赖翻译结果将对象放入可见位置,这可能就是您没有任何结果的原因。

    另外,根据你如何看待你的场景,你可能有 z 朝向相机,所以你的对象是在你从侧面看的时候被绘制的,因为它们是 2d 对象,所以你不会看到任何东西,尝试使用 x/y 或 y/z 代替你现在正在做的 x/z。

    【讨论】:

    • 在这种情况下,我将如何正确地创建一个初始的瓷砖网格,然后根据数据点提升它们?
    • 您能更具体地说明您要做什么吗?如果我做对了,您可能希望在某个点放置一个对象,其大小基于数据。所以像.. rect(x_position, y_position, width, width);在 x,y 处放置一个具有给定宽度的矩形。但同样,我不确定您所说的瓷砖网格是什么意思。
    【解决方案2】:

    您绝对可以将 pushMatrix() 和 translate() 与 beginShape() 等一起使用,它可能并不完全符合您的期望,但它肯定会从默认原点移动东西。

    你上面的例子出了什么问题,你把drawing()代码放在了你应该把它放在显示函数中的构造函数中。

    所以:

    公共无效显示(处理过程){ proc.beginShape() 等等 }

    display() 也需要在 draw() 循环中调用,所以初始化你的图块一次,然后在 draw() 中显示它们。

    【讨论】:

      【解决方案3】:

      您应该遵循@Tyler 的关于在 2D 平面(x/y、y/z、x/z)中绘图的建议。

      您的形状可能不会渲染,因为您可能只绘制了一次,并在 draw() 方法中清除了屏幕,但我不确定,因为我看不到您的其余代码。

      这就是我的意思:

      tile[][] tiles;
      int numTiles = 51;//x and y number of tiles
      
      void setup() {
        size(400,400,P3D);
        tiles = new tile[numTiles][numTiles];
        for(int i=0; i<numTiles; i++)
          for(int j=0; j<numTiles; j++)
            tiles[i][j]=new tile(i,j,0,5);
      }
      void draw() {
        background(255);
        translate(width * .5,height * .5);
        rotateY((float)mouseX/width * PI);
        rotateX((float)mouseY/height * PI);
        for(int i=0; i<numTiles; i++)
          for(int j=0; j<numTiles; j++)
            tiles[i][j].display();
      }
      class tile {
        int x,y,z;
        tile(int x, int y, int z,int s) {//s for size
          this.x=x * s;
          this.y=y * s;
          this.z=z * s;
        }
        void display(){
          beginShape(QUADS);
          //XY plane
          //*
          vertex(x,y,z);
          vertex(x+x,y,z);
          vertex(x+x,y+y,z);
          vertex(x,y+y,z);
          //*/
          endShape();
        }
      }
      

      由于您只绘制正方形,您可以使用 rect() 函数。

      int numSquares = 51,squareSize = 10;
      void setup(){
        size(400,400,P3D);
        smooth();
      }
      void draw(){
        background(255);
        translate(width * .5, height * .5);
        rotateY((float)mouseX/width * PI);
        for(int j = 0 ; j < numSquares ; j++)
          for(int i = 0 ; i < numSquares ; i++)
            rect(i*squareSize,j*squareSize,squareSize,squareSize);
      }
      

      HTH

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-25
        • 1970-01-01
        • 2021-09-12
        • 2021-05-22
        • 1970-01-01
        • 2013-06-01
        • 1970-01-01
        相关资源
        最近更新 更多