Можно ли создать 3D-модель в JavaFX 8 без текстуры?

Я хотел бы создать модель в приложении JavaFX 8, которая будет иметь ~ 400000 полигонов. И мне не нужна никакая текстура, только простой цвет. Обычно необходимо иметь что-то вроде этого:

float[] points = {
    -5, 5, 0,
    -5, -5, 0,
    5, 5, 0,
    5, -5, 0
};
float[] texCoords = {
    1, 1,
    1, 0,
    0, 1,
    0, 0
};
int[] faces = {
    2, 2, 1, 1, 0, 0,
    2, 2, 3, 3, 1, 1
};

TriangleMesh mesh = new TriangleMesh();
mesh.getPoints().setAll(points);
mesh.getTexCoords().setAll(texCoords);
mesh.getFaces().setAll(faces);

И если я использую этот код без массивов texCoords и faces, то он, конечно же, не работает. Так можно ли создать 3d модель без текстуры?


person Eugene    schedule 24.10.2013    source источник


Ответы (1)


Короткий ответ

Вы должны определить все точки, грани и координаты текстуры для TriangleMesh, чтобы сетка была допустима для рендеринга в Java 8.

Некоторые пояснения

Вы используете TriangleMesh для своей модели. Грани описывают треугольники, которые будут использоваться для рисования сетки. Если вы не укажете грани, система не сможет узнать, какие треугольники составляют полигоны, которые нужно визуализировать.

Это просто деталь реализации (которая задокументирована в javadoc TriangleMesh), которую вы должны предоставить значения координат текстуры для вашей сетки, хотя в вашем случае, когда вы будете визуализировать с одним диффузным цветом, это не имеет значения каковы ценности.

Java 8 определяет только один материал, который будет использоваться при рендеринге 3D-форм, таких как сетки. Этот материал представляет собой PhongMaterial. С PhongMaterial вам не нужно предоставлять текстуру изображения для рендеринга материала, вы можете использовать основной цвет для материала (например, синий), вызвав material.setDiffuseColor(Color.BLUE). Каждый из многоугольников будет затенен в соответствии с алгоритмом затенения Фонга, принимая во внимание другие элементы в график сцены, такой как точечные источники света, рассеянное освещение, прозрачные области, закрытые области, зеркальные блики и т. д. Это позволяет вам реалистично просматривать модель (если бы весь многоугольник был просто окрашен в синий цвет, он просто отображался бы как голубая капля, и вы бы невозможно различить внутренние детали модели).

Можно использовать и другие методы затенения, такие как плоское затенение или затенение по Гуро или пользовательские алгоритмы затенения, но материалы, использующие эти методы затенения, не поддерживаются в Java 8 — вы должны использовать PhongMaterial.

Теперь, если вы установите диффузный цвет вашего PhongMaterial на сплошной цвет и не установите никаких других значений для вашего PhongMaterial, значения координат текстуры, предоставленные TriangleMesh, не будут иметь значения. Координаты текстуры предоставляются, чтобы шейдер мог искать цвета пикселей из материала для рендеринга полигонов. Поскольку материал имеет один однородный цвет, вы можете указать любую допустимую координату текстуры (например, любое значение от 0 до 1), и он вернет тот же цвет. Таким образом, в вашем случае вам не нужно вычислять координаты текстуры для вашей модели, если вы этого не хотите, вы можете установить все значения координат текстуры на 0 или 1, и вы получите тот же визуализированный выход.

person jewelsea    schedule 24.10.2013