我正在尝试绘制一个可以旋转和提升的3D平铺网格。
网格虽然有时会旋转,但不会显示图形,并将其毁坏。常规网格应该看起来不像这样。
上半部分不应出现。
任何人都可以帮助解释或举例说明可能导致此问题的原因吗? 刚发现其他东西:当你看到尖峰出现时,在屏幕的一侧,在对面,那个瓷砖丢失了。 :
答案 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
已经越过零。当它越过零时,它会导致上面两行计算的x1
和y1
值的符号发生变化。此符号更改是导致网格显示错误的原因。
我不是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
$