Класс PhongMaterial
public non-sealed class PhongMaterial extends Material
Компоненты диффузного и зеркального отражения могут быть заданы цветом и/или текстурной картой (представленной в виде изображения). Если оба компонента применяются, их значения перемножаются. Например:
Color#LIMEGREEN * =
Color#CYAN * =
Примечание: компонент самоизлучения в настоящее время не может быть задан как цвет. Однако цвет ведет себя как карта (любого размера) с однородным цветом. Создание карты размером 1x1 пиксель с этим цветом даст тот же эффект.
PhongMaterial не подходит для поверхностей, которые ведут себя как зеркала и отражают окружающую среду, такие как отражающие металлы, вода и отражающая керамика. Также свет не преломляется (не искривляется) при прохождении через прозрачные или полупрозрачные материалы, такие как вода, стекло или лед. Эти материалы полагаются на эффекты Френеля, которые не реализованы для этого материала.
Компоненты
| Прозрачный | Ламбертовский | Отражающий |
Материалы, у которых диффузный компонент пропускает только проходящие лучи, являются прозрачными. У них все равно есть зеркальный компонент, в противном случае они будут невидимы (такого материала не существует). Материалы без зеркального компонента и у которых диффузный компонент пропускает только отраженные лучи, демонстрируют ламбертовское отражение. Ламбертовские материалы отражают свет во всех направлениях одинаково. Материалы со зеркальным компонентом и диффузным компонентом, который допускает только слабое отражение, являются отражающими.
Диффузный
Диффузный компонент, иногда называемый альбедо, служит основным цветом поверхности. Он представляет свет, который не отражается непосредственно от поверхности, а вместо этого проникает в материал.Альфа-канал диффузного компонента управляет светом, проходящим сквозь него (пропускаемым). Уменьшение значения альфа увеличивает прозрачность материала и делает объект полупрозрачным, а в конечном итоге и прозрачным. Материалы, такие как стекло и пластик, могут быть смоделированы с низким значением альфа.
Свет, который не пропускается, подвергается рассеянию под поверхностью, что приводит к его поглощению в материале или отражению обратно на поверхность, выходящему во всех (приблизительно) направлениях (независимо от угла падения). Каналы RGB диффузного компонента управляют тем, какие цвета поглощаются, а какие отражаются, придавая материалу его основной цвет. Чем выше значение одного из значений RGB, тем больше этот материал отражает этот цвет.
Диффузный компонент взаимодействует со всеми источниками света — как с теми, которые имеют направленность, так и AmbientLight, что имитирует свет, поступающий со всех направлений.
Важно: в настоящее время существует ошибка, из-за которой объекты с 0 непрозрачностью вообще не рендерятся (несмотря на наличие зеркального или самоизлучающего компонента). Установка непрозрачности в 1/255 вместо этого даст желаемый результат.
Зеркальный
Зеркальный компонент представляет свет, отражаемый непосредственно от поверхности. Для большинства материалов цвет зеркального компонента находится в шкале серого независимо от цвета диффузного компонента. Это означает, что зеркальный блик будет иметь цвет света, а не цвет материала. Такие материалы иногда называют диэлектриками. Металлы, с другой стороны, отражают цвет, похожий на их диффузный цвет (например, желтый для золота или красноватый для меди) и большую часть своего внешнего вида получают от зеркального цвета. Такие материалы иногда называют проводниками.Распространение лучей, отраженных от поверхности, имитирует микрогеометрию, которая заставляет смежные лучи отражаться в разных направлениях. Микрогеометрия гладких поверхностей мало отличается, что приводит к сильному зеркальному компоненту, который обеспечивает глянцевый вид, такой как пластик, обработанная древесина и отполированные металлы. И наоборот, шероховатые поверхности имеют переменную микрогеометрию, слабый зеркальный компонент и матовый вид, например, необработанная древесина, ткань и картон. Это распределение контролируется мощностью зеркального компонента, иногда называемой гладкостью или, наоборот, шероховатостью. Более высокое значение мощности зеркального компонента имитирует более гладкий объект, что приводит к меньшему отражению.
Зеркальный компонент взаимодействует только со светами, имеющими направленность (не AmbientLight), так как он зависит от направления падающего луча, а также от положения наблюдателя (камеры), так как он зависит от направления отражения.
Альфа-компонент цвета зеркального компонента в настоящее время не используется.
Самоизлучение
Компонент самоизлучения, также называемый испускающим, представляет свет, испускаемый объектом. Он не взаимодействует с источниками света, и поэтому положение наблюдателя не имеет значения. Указание этого компонента не приводит к тому, что объект выступает в качестве источника света — необходимо добавить источник света в положение объекта с цветом, соответствующим этому цвету. Если используется карта нескольких цветов, несколько источников света соответствующих цветов могут быть размещены надлежащим образом в объёме объекта, чтобы обеспечить реалистичный вид.Альфа-компонент цвета самоизлучения в настоящее время не используется.
Выступ
Компонент выступ создаёт иллюзию небольших изменений высоты на поверхности, например, бугорков и гребней. Это карта нормалей (а не карта высот или карта смещения), которая работает путём изменения нормалей поверхностей на объекте, заставляя свет взаимодействовать с поверхностью иначе, чем без неё. Стволы деревьев и шероховатые камни могут быть смоделированы с помощью карты выступов.Карты выступов менее затратны, чем изменение сетки путём разделения поверхности на множество полигонов, обращённых в разные стороны. Если физическая геометрия поверхности не важна (например, для расчётов пересечения), рекомендуется использовать карту выступов.
Альфа-компонент карты выступов в настоящее время не используется.
Математическая модель
L — вектор от поверхности к источнику света;
N — вектор нормали поверхности;
V — вектор от поверхности к наблюдателю (камере);
R — вектор отражения L от поверхности. R можно вычислить из L и N: R=2(L⋅N)N - L.
Диффузный и зеркальный компоненты состоят из 3 факторов: геометрии, цвета света и цвета материала, каждый из которых рассматривается в каждой точке поверхности. Вычисление цвета света описывается в LightBase (и его подклассах). Вычисление цвета материала, как описано выше, представляет собой перемножение свойств цвета и карты. Эти факторы перемножаются, чтобы получить окончательный цвет.
Выступ
По умолчанию вектор нормали точки на полигоне — N=(0, 0, 1) (направлен от поверхности). Если указана карта выступов, этот вектор будет иметь другое значение, в зависимости от значений RGB на карте выступов: N=2 * RGB - 1. Значение по умолчанию для карты выступов (соответствующее умолчанию нормали) — RGB=(0.5, 0.5, 1), поэтому карты выступов имеют тенденцию быть голубоватыми.Мы будем использовать N как вектор нормали после применения карты выступов, если она доступна.
Диффузный
Диффузный компонент представляет свет, рассеянный от поверхности во всех направлениях, следовательно, он зависит от взаимодействия света и поверхности (и независимо от положения наблюдателя): L⋅N. L⋅N — геометрический множитель диффузного компонента. Он регулирует интенсивность цвета, получающегося от попадания света на поверхность под разными углами. Если луч света параллелен поверхности, L⋅N=0 и вклад диффузного света будет равен 0; если луч света перпендикулярен поверхности (совпадает с вектором нормали), L⋅N=1 и никакого уменьшения интенсивности не происходит. Определив цвет света как CL, а диффузный цвет материала как CDM, мы перемножаем 3 фактора, описанных выше: L⋅N * CL * CDM. Для i источников света, освещающих поверхность, вклад каждого источника суммируется:
Σi(Li⋅N * CLi * CDM) = Σi(Li⋅N * CLi) * CDM (так как CDM — свойство материала и одинаково для всех источников света).
Поскольку AmbientLight имитирует свет, исходящий и рассеивающийся во всех направлениях, он полностью вносит вклад в диффузный компонент (L⋅N=1). Мы определим вклад всех источников рассеянного света как A=Σi(CLi), а вклад всех других источников (с вектором света) как D=Σi(Li⋅N * CLi). Полный вклад диффузного компонента тогда равен (A+D) * CDM.
Зеркальный
Зеркальный компонент представляет свет, отражённый от поверхности подобно зеркалу, поэтому он зависит от взаимодействия отражённого света и положения наблюдателя: R⋅V. Как и в разделе с диффузным компонентом, геометрический вклад максимален, когда наблюдатель выровнен с вектором отражения, и равен нулю, когда они перпендикулярны.
Значение отражательной силы, P, описывает гладкость поверхности. Более гладкие поверхности имеют более узкие отражения, и их значение отражательной силы меньше (изображение справа), тогда как более шероховатые поверхности имеют более рассеянные отражения, и их значение отражательной силы больше (изображение слева). Так как 0≤R⋅V≤1, то выражение (R⋅V)P уменьшается при увеличении P, что приводит к меньшему вкладу.
Как и в случае с диффузным компонентом, итоговый цвет отражения рассчитывается путем умножения геометрического фактора, цвета света и цвета отражения материала, CSM, для каждого источника света:
Σi((Ri⋅V)P * CLi) * CSM, и определив вклад источников отражения как S=Σi((Ri⋅V)P * CLi), общий вклад компонента отражения равен S * CSM.
Самоизлучение
Компонент самоизлучения представляет свет, исходящий от поверхности, поэтому он не зависит от источников света, геометрии или позиции наблюдателя. Его вклад — просто цвет самоизлучения материала, CLM.Резюме
Итоговый цвет в точке вычисления: (A+D) * CDM + S * CSM + CLM.Примеры
В этом разделе представлены примеры для моделирования различных распространенных материалов. Каждое изображение будет сопровождаться используемыми значениями материала. Значения, которые не указаны, являются значениями по умолчанию.Гладкость
Значение отражательной силы управляет размером бликов отражения, что изменяет вид гладкости или шероховатости. Меньшие значения создают более крупные блики и наоборот. Некоторые пластмассы и мрамор демонстрируют такое поведение, как показано здесь на двух бильярдных шарах:| Изображение | ||
| Диффузный цвет | Color.YELLOW.darker() | Color.RED.darker() |
| Цвет отражения | Color.WHITE | Color.WHITE |
| Значение отражательной силы | 10 | 150 |
Прозрачность
Некоторые материалы являются прозрачными/полупрозрачными, позволяя большинству света проходить сквозь них, как стекло и пластмассы. Это достигается с низкими значениями непрозрачности (альфа) для диффузного компонента. Тон может быть получен с помощью небольших значений RGB в дополнение. Гладкость этих материалов также означает наличие компонента отражения с силой, зависящей от отделки/полировки материала. Высокий яркий цвет отражения обеспечивает более глянцевый вид, а низкий — более матовый.| Изображение | ||||
| Диффузный цвет | Color.rgb(0, 0, 0, 0.3) | Color.rgb(0, 0, 0, 0.3) | Color.rgb(0, 0, 0, 0.3) | Color.rgb(75, 0, 0, 0.15) |
| Цвет отражения | Color.hsb(0, 0, 0) | Color.hsb(0, 0, 45) | Color.hsb(0, 0, 90) | Color.hsb(0, 0, 45) |
Цвет отражения
Металлы отражают свой собственный цвет, а не полный цвет света. В этом случае цвет отражения должен быть похож на цвет рассеяния, а его яркость влияет на уровень блеска/полировки. Здесь показаны медь и золото.| Изображение | |||||
| Диффузный цвет | Color.hsb(20, 85, 70) | Color.hsb(20, 85, 70) | Color.hsb(20, 85, 70) | Color.hsb(41, 82, 92) | Color.hsb(41, 82, 92) |
| Цвет отражения | Color.hsb(20, 85, 40) | Color.hsb(20, 85, 70) | Color.hsb(20, 85, 100) | Color.hsb(41, 82, 30) | Color.hsb(41, 82, 92) |
Карты и детали поверхности
Карты отражения и рельефа могут обеспечивать детали поверхности, которые делают объект более реалистичным. Ствол дерева, у которого низкая отражательная способность, имеет много борозд, которые можно подчеркнуть с помощью карты рельефа:| Рельеф | Диффузия | Рельеф+Диффузия |
HSB=(0, 0, 60). Отполированная древесина, подобная той, что используется в строительстве, имеет сильный компонент отражения из-за отделки и полировки. Комбинация карты отражения и карты рельефа выделяет детали в древесине:
| Диффузия | Диффузия+Отражение | Диффузия+Рельеф | Диффузия+Отражение+Рельеф |
Анимация текстур
Анимация текстур и эффекты во время выполнения могут быть достигнуты различными способами. Во-первых, анимированный GIF может быть использован какImage для карт текстур, как показано здесь при использовании в качестве карты диффузии: Во-вторых, используя WritableImage, значения пикселей можно изменять программно, создавая живую текстуру, как показано на этом фрагменте кода, который перекрашивает изображение слева направо и сверху вниз:
WritableImage diffuseMap = ...
material.setDiffuseMap(diffuseMap);
var timer = new AnimationTimer() {
int x, y;
@Override
public void handle(long now) {
diffuseMap.getPixelWriter().setColor(x, y, Color.color(0, 0, 1, 0.5));
x++;
if (x > diffuseMap.getWidth() - 1) {
x = 0;
y++;
if (y > diffuseMap.getHeight() - 1) {
stop();
}
}
}
};
timer.start();
Другой способ анимации текстур — изменение
texture coordinates сетки, объяснение которого выходит за рамки данного класса. - С момента:
- JavaFX 8.0
- См. также:
Краткое описание свойств
| Тип | Свойство | Описание |
|---|---|---|
final ObjectProperty |
bumpMap |
Карта выступов этого PhongMaterial, которая представляет собой карту нормалей, хранящуюся как RGB-изображение. |
final ObjectProperty |
diffuseColor |
Диффузный цвет этого PhongMaterial. |
final ObjectProperty |
diffuseMap |
Карта диффузии этого PhongMaterial. |
final ObjectProperty |
selfIlluminationMap |
Карта собственного освещения этого PhongMaterial. |
final ObjectProperty |
specularColor |
Спекулярный цвет этого PhongMaterial. |
final ObjectProperty |
specularMap |
Карта зеркального отражения этого PhongMaterial. |
final DoubleProperty |
specularPower |
Спекулярная сила этого PhongMaterial. |
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
PhongMaterial() |
Создаёт новый экземпляр класса PhongMaterial с полем Color.WHITE diffuseColor по умолчанию. |
PhongMaterial |
Создаёт новый экземпляр класса PhongMaterial, используя указанный цвет для свойства diffuseColor. |
PhongMaterial |
Создаёт новый экземпляр класса PhongMaterial, используя указанные цвета и изображения для свойств diffuseColor. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
final ObjectProperty |
bumpMapProperty() |
Карта выступов этого PhongMaterial, которая представляет собой карту нормалей, хранящуюся как RGB-изображение. |
final ObjectProperty |
diffuseColorProperty() |
Диффузный цвет этого PhongMaterial. |
final ObjectProperty |
diffuseMapProperty() |
Карта диффузии этого PhongMaterial. |
final Image |
getBumpMap() |
Получает значение свойства bumpMap. |
final Color |
getDiffuseColor() |
Получает значение свойства diffuseColor. |
final Image |
getDiffuseMap() |
Получает значение свойства diffuseMap. |
final Image |
getSelfIlluminationMap() |
Получает значение свойства selfIlluminationMap. |
final Color |
getSpecularColor() |
Получает значение свойства specularColor. |
final Image |
getSpecularMap() |
Получает значение свойства specularMap. |
final double |
getSpecularPower() |
Получает значение свойства specularPower. |
final ObjectProperty |
selfIlluminationMapProperty() |
Карта собственного освещения этого PhongMaterial. |
final void |
setBumpMap |
Устанавливает значение свойства bumpMap. |
final void |
setDiffuseColor |
Устанавливает значение свойства diffuseColor. |
final void |
setDiffuseMap |
Устанавливает значение свойства diffuseMap. |
final void |
setSelfIlluminationMap |
Устанавливает значение свойства selfIlluminationMap. |
final void |
setSpecularColor |
Устанавливает значение свойства specularColor. |
final void |
setSpecularMap |
Устанавливает значение свойства specularMap. |
final void |
setSpecularPower |
Устанавливает значение свойства specularPower. |
final ObjectProperty |
specularColorProperty() |
Спекулярный цвет этого PhongMaterial. |
final ObjectProperty |
specularMapProperty() |
Карта зеркального отражения этого PhongMaterial. |
final DoubleProperty |
specularPowerProperty() |
Спекулярная сила этого PhongMaterial. |
Подробное описание свойств
diffuseColor
public final ObjectProperty<Color> diffuseColorProperty
PhongMaterial.- Значение по умолчанию:
Color.WHITE- См. также:
specularColor
public final ObjectProperty<Color> specularColorProperty
PhongMaterial.- Значение по умолчанию:
null- См. также:
specularPower
public final DoubleProperty specularPowerProperty
PhongMaterial.- Значение по умолчанию:
- 32.0
- См. также:
diffuseMap
public final ObjectProperty<Image> diffuseMapProperty
PhongMaterial.- Значение по умолчанию:
null- См. также:
specularMap
public final ObjectProperty<Image> specularMapProperty
PhongMaterial.- Значение по умолчанию:
null- См. также:
bumpMap
public final ObjectProperty<Image> bumpMapProperty
PhongMaterial, которая представляет собой карту нормалей, хранящуюся в формате RGB изображения.- Значение по умолчанию:
null- См. также:
selfIlluminationMap
public final ObjectProperty<Image> selfIlluminationMapProperty
PhongMaterial.- Значение по умолчанию:
null- См. также:
Подробное описание конструкторов
PhongMaterial
public PhongMaterial()
PhongMaterial со свойством Color.WHITE diffuseColor по умолчанию.PhongMaterial
public PhongMaterial(Color diffuseColor)
PhongMaterial, используя указанный цвет для свойства diffuseColor.- Параметры:
-
diffuseColor- цвет свойства diffuseColor
PhongMaterial
public PhongMaterial(Color diffuseColor, Image diffuseMap, Image specularMap, Image bumpMap, Image selfIlluminationMap)
PhongMaterial, используя указанные цвета и изображения для свойств diffuseColor.- Параметры:
-
diffuseColor- цвет свойства diffuseColor -
diffuseMap- изображение свойства diffuseMap -
specularMap- изображение свойства specularMap -
bumpMap- изображение свойства bumpMap -
selfIlluminationMap- изображение свойства selfIlluminationMap
Подробное описание методов
setDiffuseColor
public final void setDiffuseColor(Color value)
diffuseColor.- Описание свойства:
- Цвет диффузного отражения этого
PhongMaterial. - Значение по умолчанию:
Color.WHITE- Параметры:
-
value- значение для свойстваdiffuseColor - См. также:
getDiffuseColor
public final Color getDiffuseColor()
diffuseColor.- Описание свойства:
- Цвет диффузного отражения этого
PhongMaterial. - Значение по умолчанию:
Color.WHITE- Возвращаемое значение:
- значение свойства
diffuseColor - См. также:
diffuseColorProperty
public final ObjectProperty<Color> diffuseColorProperty()
PhongMaterial.- Значение по умолчанию:
Color.WHITE- Возвращаемое значение:
- свойство
diffuseColor - См. также:
setSpecularColor
public final void setSpecularColor(Color value)
specularColor.- Описание свойства:
- Цвет зеркального отражения этого
PhongMaterial. - Значение по умолчанию:
null- Параметры:
-
value- значение для свойстваspecularColor - См. также:
getSpecularColor
public final Color getSpecularColor()
specularColor.- Описание свойства:
- Цвет зеркального отражения этого
PhongMaterial. - Значение по умолчанию:
null- Возвращаемое значение:
- значение свойства
specularColor - См. также:
specularColorProperty
public final ObjectProperty<Color> specularColorProperty()
PhongMaterial.- Значение по умолчанию:
null- Возвращаемое значение:
- свойство
specularColor - См. также:
setSpecularPower
public final void setSpecularPower(double value)
specularPower.- Описание свойства:
- Степень зеркального отражения этого
PhongMaterial. - Значение по умолчанию:
- 32.0
- Параметры:
-
value- значение для свойстваspecularPower - См. также:
getSpecularPower
public final double getSpecularPower()
specularPower.- Описание свойства:
- Степень зеркального отражения этого
PhongMaterial. - Значение по умолчанию:
- 32.0
- Возвращаемое значение:
- значение свойства
specularPower - См. также:
specularPowerProperty
public final DoubleProperty specularPowerProperty()
PhongMaterial.- Значение по умолчанию:
- 32.0
- Возвращает:
- свойство
specularPower - См. также:
setDiffuseMap
public final void setDiffuseMap(Image value)
diffuseMap.- Описание свойства:
- Карта рассеяния этого
PhongMaterial. - Значение по умолчанию:
null- Параметры:
-
value- значение для свойстваdiffuseMap - См. также:
getDiffuseMap
public final Image getDiffuseMap()
diffuseMap.- Описание свойства:
- Карта рассеяния этого
PhongMaterial. - Значение по умолчанию:
null- Возвращает:
- значение свойства
diffuseMap - См. также:
diffuseMapProperty
public final ObjectProperty<Image> diffuseMapProperty()
PhongMaterial.- Значение по умолчанию:
null- Возвращает:
- свойство
diffuseMap - См. также:
setSpecularMap
public final void setSpecularMap(Image value)
specularMap.- Описание свойства:
- Карта блеска этого
PhongMaterial. - Значение по умолчанию:
null- Параметры:
-
value- значение для свойстваspecularMap - См. также:
getSpecularMap
public final Image getSpecularMap()
specularMap.- Описание свойства:
- Карта блеска этого
PhongMaterial. - Значение по умолчанию:
null- Возвращает:
- значение свойства
specularMap - См. также:
specularMapProperty
public final ObjectProperty<Image> specularMapProperty()
PhongMaterial.- Значение по умолчанию:
null- Возвращает:
- свойство
specularMap - См. также:
setBumpMap
public final void setBumpMap(Image value)
bumpMap.- Описание свойства:
- Карта рельефа этого
PhongMaterial, которая представляет собой карту нормалей, хранящихся как изображение RGB. - Значение по умолчанию:
null- Параметры:
-
value- значение для свойстваbumpMap - См. также:
getBumpMap
public final Image getBumpMap()
bumpMap.- Описание свойства:
- Карта рельефа этого
PhongMaterial, которая представляет собой карту нормалей, хранящихся как изображение RGB. - Значение по умолчанию:
null- Возвращает:
- значение свойства
bumpMap - См. также:
bumpMapProperty
public final ObjectProperty<Image> bumpMapProperty()
PhongMaterial, которая представляет собой карту нормалей, хранящихся как изображение RGB.- Значение по умолчанию:
null- Возвращает:
- свойство
bumpMap - См. также:
setSelfIlluminationMap
public final void setSelfIlluminationMap(Image value)
selfIlluminationMap.- Описание свойства:
- Карта самоосвещения этого
PhongMaterial. - Значение по умолчанию:
null- Параметры:
-
value- значение для свойстваselfIlluminationMap - См. также:
getSelfIlluminationMap
public final Image getSelfIlluminationMap()
selfIlluminationMap.- Описание свойства:
- Карта самоосвещения этого
PhongMaterial. - Значение по умолчанию:
null- Возвращает:
- значение свойства
selfIlluminationMap - См. также:
selfIlluminationMapProperty
public final ObjectProperty<Image> selfIlluminationMapProperty()
PhongMaterial.- Значение по умолчанию:
null- Возвращает:
- свойство
selfIlluminationMap - См. также:
© 2008, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from JavaFX API Documentation.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Java, JavaFX and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.