破碎的Java 3D图形

时间:2012-01-31 21:52:34

标签: java graphics 3d

我正在尝试绘制一个可以旋转和提升的3D平铺网格。

网格虽然有时会旋转,但不会显示图形,并将其毁坏。常规网格应该看起来不像这样。

上半部分不应出现。

enter image description here

任何人都可以帮助解释或举例说明可能导致此问题的原因吗? 刚发现其他东西:当你看到尖峰出现时,在屏幕的一侧,在对面,那个瓷砖丢失了。 :

enter image description here

2 个答案:

答案 0 :(得分:2)

我发现如果您将azimuth设置为133,将elevation设置为324,将zmod设置为-0.9,则将xmod设置为0并将网格更改为7×7而不是10×10,那么只有一个单点'行为不端'。对于这一个行为不端的问题,我们有:

  • i = 48,j = 3,
  • x0 = 7.0,y0 = 0.0,z0 = 6.1,
  • x1 = -0.31273127,y1 = 5.4544506,z1 = -7.5074077,
  • near = 6.0且nearToObj = 1.5,

就在以下两行之前:

            x1 = x1 * near / (z1 + near + nearToObj);
            y1 = y1 * near / (z1 + near + nearToObj);

这里的关键是z1 + near + nearToObj已经越过零。当它越过零时,它会导致上面两行计算的x1y1值的符号发生变化。此符号更改是导致网格显示错误的原因。

我不是3D图形方面的专家,但我相信这个结果表明你无法描绘这个问题,因为它已经落后于相机。我担心我不确定解决这个问题的最佳方法是什么 - 这需要比我更多的3D图形知识。


至于我的另一个答案,这是完全错误的,所以我删除了它。如果我要声称Java 2D图形API是使用16位整数进行包装,我至少可以尝试验证

g.drawLine(30, 30, 60, 60);

g.drawLine(30, 30, 60 + 65536, 60 + 65536);

产生相同的输出。他们没有。

答案 1 :(得分:1)

(new BasicStroke(6 / 5))应该做什么?

6 / 5是写1的一种奇特方式。

$ cat Int.java
class Int {
    public static void main(String args[]) {
        System.out.println("6 / 5 == " + (6 / 5));
        return;
    }
}
$ make Int.class
javac Int.java
$ java Int
6 / 5 == 1
$