3d 正在处理3 PShape.setTexture数组索引越界错误

3d 正在处理3 PShape.setTexture数组索引越界错误,3d,processing,3d,Processing,以下代码生成数组越界异常(ArrayIndexOutOfBoundsException:-2) 我不知道为什么,我一直在网上学习教程。已经通读了参考资料和处理Javadoc,但没有太多关于该方法的信息。有人有什么想法吗 someImage.jpg是一个1200 X 600的图像文件 班级舞会 { 浮子大小; 球(浮子大小) { 这个。大小=大小; } 无效显示(PImage img) { 塑造我的球; my_ball=创建形状(球体、大小); 形状(我的球); 我的球。塞特克斯特(img); }

以下代码生成数组越界异常(ArrayIndexOutOfBoundsException:-2)

我不知道为什么,我一直在网上学习教程。已经通读了参考资料和处理Javadoc,但没有太多关于该方法的信息。有人有什么想法吗

someImage.jpg是一个1200 X 600的图像文件

班级舞会
{
浮子大小;
球(浮子大小)
{
这个。大小=大小;
}
无效显示(PImage img)
{
塑造我的球;
my_ball=创建形状(球体、大小);
形状(我的球);
我的球。塞特克斯特(img);
}
}//末级
皮马杰;
球a=新球(25);
无效设置()
{
尺寸(600、600、P3D);
img=loadImage(“someImage.jpg”);
}
作废提款()
{
a、 表演(img);
}

在setup()中调用size()后,仅实例化一次形状可能会有所帮助。然后,绘制循环可以简单地显示形状和纹理。注意在size()之后的setup()期间如何调用createShape

下面是重构代码(在Win10上的P3.2.1中工作正常),您可以在系统上尝试:

class Ball {
  float size;
  PShape my_ball;

  Ball(float size) {
    this.size = size;
    my_ball = createShape(SPHERE, size);
    my_ball.setStroke(false);
  }

  void show(PImage img) {
    my_ball.setTexture(img);
    shape(my_ball);
  }
}//end class

PImage img;
Ball a;

void setup() {
  size(600, 600, P3D);
  img = loadImage("someImage.jpg");
  a = new Ball(600.0);
}

void draw() {
  translate(300,300,-1200);
  a.show(img);
}

更新:上面代码中固定了两行:在调用shape()之前设置纹理,并且应在my_ball对象上调用.setStroke()方法以禁用笔划。注意:如果在shape()之后调用setTexture(),我会得到相同的越界异常。

这段代码对我来说运行良好。你能提供你正在使用的图像文件的链接吗?@KevinWorkman你介意我问一下你使用的是什么操作系统吗。我开始认为这是Ubuntu 16.4的一个bug,该图像文件也可以正常工作。我在Windows 10上,使用Processing 3.1.1。你运行OP的原始代码了吗?你也犯了同样的错误吗?如果不是,那么这段代码并不是真正的“修复”任何东西。我同意只调用一次
createShape()
函数对于这个小示例来说是个好主意,但在OP的完整草图中可能不是这样,OP的代码应该可以工作,并且在我的计算机上工作得很好。它在您的机器上工作吗?@James Dunn,这些更改现在不会给出JM错误,但是映像没有正确加载,并且noFill()noStroke()调用被忽略。我在draw函数的开头有noStroke()和noFill(),就在a.show()@kevin workman的上方,请参见更新。在遇到与OP相同的错误并且没有正确查看纹理贴图后,我调查并找到了正确的协议。OP,请在您的配置上尝试更新的代码。