Сломанная Java 3D-графика - PullRequest
2 голосов
/ 01 февраля 2012

Я пытаюсь нарисовать трехмерную сетку плиток, которую можно поворачивать и поднимать.

Хотя сетка, когда она поворачивается иногда, не показывает графику, как следует, а калечит ее.Обычная сетка не должна выглядеть так.

Верхняя половина не должна присутствовать.

enter image description here

Может кто-нибудь помочь объяснить или привести примеры того, что может бытьвызывая эту проблему?Просто нашел что-то еще: когда вы видите всплеск, на одной стороне экрана, на противоположной, эта плитка отсутствует.:

enter image description here

Ответы [ 2 ]

2 голосов
/ 03 февраля 2012

Я обнаружил, что если вы установите azimuth на 133, elevation на 324, zmod на -0,9, оставьте xmod на 0 и измените сетку на 7 & times; 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-графике, но я полагаю, что этот результат говорит о том, что вы не можете нарисовать вопрос, потому что он скрылся за камерой. Боюсь, я не уверен, каким будет лучший способ решить эту проблему - для этого потребуется больше знаний о трехмерной графике, чем у меня.


Что касается моего другого ответа, он был совершенно неверным, поэтому я удалил его. Если бы я собирался заявить, что API Java 2D-графики - это любое делающее обертывание с использованием 16-разрядных целых чисел, я бы, по крайней мере, попытался проверить, что

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

и

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

дал тот же результат. Они не.

1 голос
/ 01 февраля 2012

Что (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
$ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...