照明设备
|
该页面正在翻译中。 |
Makie的照明能力在后端和绘图类型之间有所不同。 它们是针对网格相关绘图类型实现的(网格;网格, 网状散射, 表面),它们的衍生物(例如3D 箭头)在某种程度上 卷数 地块(和 轮廓3d). 关于后端:
-
GLMakie实现了基线照明模型,并将作为本页的默认值.
-
WGLMakie实现了glmakie的照明的简化版本。
-
由于其有限的3D功能,CairoMakie实现了有限的照明
-
RPRMakie实现了Makies照明模型的部分,但也可以使用RadeonProRender更复杂的方法。
材质属性
在3d渲染中,材质描述了物体对光的反应。 这可以包括物体的颜色,镜面反射的明亮和锐利,它看起来有多金属,它有多粗糙等等。 然而,在Makie中,模型仍然相当简单和有限。 目前有以下材质属性可用:
-
扩散::Vec3f=Vec3f(1.0):控制对象的漫反射在红色、绿色和蓝色通道中的强度。 漫反射是指入射光向各个方向散射的反射。 这种反射的强度基于撞击表面的光量,其与点(light_direction,-normal). 它通常构成物体在光线中的主要颜色。 -
镜面::Vec3f=Vec3f(0.4):控制红、绿、蓝三色通道镜面反射的强度。 镜面反射是光的直接反射,即入射角的反射点(light_direction,-normal)匹配出射角度点(camera_direction,-normal). 它负责物体上的亮点。 请注意,这并不考虑对象的颜色,因为镜面反射通常与光的颜色相匹配。 -
光泽度::Float32=32f0:控制镜面反射的清晰度。 低光泽度将允许传入的出射角度之间的较大差异生效,创造一个更大更平滑的亮点。 高光泽度将分别减小亮点的尺寸并增加其锐度。 此值必须为正值。 -
背光::Real=0控制光线与物体背面相互作用的强烈程度。 将其设置为值> 0在可视化曲面时会很有帮助。 (更确切地说,光计算用倒法线重复,结果与背光源作为一个前因子。)
|
注意RPRMakie不使用这些材质属性。 相反,它依赖于RadeonProRender的材料系统,该系统通过 |
照明算法
灯光通过控制 灯光 向量在a 场景 而由 底纹/底纹 情节中的属性。 通常你不需要设置 底纹/底纹 你自己,因为它是基于灯光矢量派生的。 可能的选择 底纹/底纹 是:
-
底纹=NoShading禁用光计算,从而显示对象的纯色。 -
阴影=快速阴影启用一个简化的照明模型,只允许一个[医]AmbientLight还有一个方向及方向. -
着色=MultiLightShading是一个GLMakie独家选项,可启用多个光源(如屏幕保护程序,默认为64)以及点灯,点灯和聚光灯. -
阴影=Makie。自动的根据其中的灯光派生上述选项之一场景。灯光
|
注意您可以访问 |
作为参考,GLMakie,WGLMakie和一些扩展CairoMakie中的所有照明计算(环境除外)最终使用https://en.wikipedia.org/wiki/Blinn%E2%80%93Phong_reflection_model[Blinn-Phong反射模型]归结为
function blinn_phong(
diffuse, specular, shininess, normal, object_color,
light_color, light_direction, camera_direction
)
diffuse_coefficient = max(dot(light_direction, -normal), 0.0)
H = normalize(light_direction + camera_direction)
specular_coefficient = max(dot(H, -normal), 0.0)^shininess
return light_color * (
diffuse * diffuse_coefficient * object_color +
specular * specular_coefficient
)
end
不同的光源控制 光向;光向 并可能进一步调整该功能的结果。 例如, 聚光灯 增加了一个因素,降低其区域外的光强度。
光的种类
[医]AmbientLight
using CairoMakie
fig = Figure(size = (600, 600))
ax11 = LScene(fig[1, 1], scenekw = (lights = [],))
ax12 = LScene(fig[1, 2], scenekw = (lights = [AmbientLight(RGBf(0, 0, 0))],))
ax21 = LScene(fig[2, 1], scenekw = (lights = [AmbientLight(RGBf(0.7, 0.7, 0.7))],))
ax22 = LScene(fig[2, 2], scenekw = (lights = [AmbientLight(RGBf(0.8, 0.3, 0))],))
for ax in (ax11, ax12, ax21, ax22)
mesh!(ax, Sphere(Point3f(0), 1f0), color = :white)
end
fig
方向及方向
using GLMakie
fig = Figure(size = (600, 600))
ax11 = LScene(fig[1, 1], scenekw = (lights = [DirectionalLight(RGBf(0, 0, 0), Vec3f(-1, 0, 0))],))
ax12 = LScene(fig[1, 2], scenekw = (lights = [DirectionalLight(RGBf(1, 1, 1), Vec3f(-1, 0, 0))],))
lights = [
DirectionalLight(RGBf(0, 0, 0.7), Vec3f(-1, -1, 0)),
DirectionalLight(RGBf(0.7, 0.2, 0), Vec3f(-1, 1, -1)),
DirectionalLight(RGBf(0.7, 0.7, 0.7), Vec3f(1, -1, -1))
]
ax21 = LScene(fig[2, 1], scenekw = (lights = lights,))
ax22 = LScene(fig[2, 2], scenekw = (lights = [DirectionalLight(RGBf(4, 2, 1), Vec3f(0, 0, -1))],))
for ax in (ax11, ax12, ax21, ax22)
mesh!(ax, Sphere(Point3f(0), 1f0), color = :white)
end
fig
点灯,点灯
using GLMakie
图=图(尺寸=(600,600))
ax=LScene(fig[1,1],scenekw=(lights=[PointLight(RGBf(1,1,1),Point3f(0, 0, 0))],))
ps=[Point3f(x,y,z)for x in(-1,0,1)for y in(-1,0,1)for z in(-1,0,1)]
meshscatter!(ax,ps,color=:白色)
无花果
using GLMakie
lights = [
PointLight(RGBf(1, 1, 1), Point3f(0, 0, 5), 50),
PointLight(RGBf(2, 0, 0), Point3f(-3, -3, 2), 10),
PointLight(RGBf(0, 2, 0), Point3f(-3, 3, 2), 10),
PointLight(RGBf(0, 0, 2), Point3f( 3, 3, 2), 10),
PointLight(RGBf(2, 2, 0), Point3f( 3, -3, 2), 10),
]
fig = Figure(size = (600, 600))
ax = LScene(fig[1, 1], scenekw = (lights = lights,))
ps = [Point3f(x, y, 0) for x in -5:5 for y in -5:5]
meshscatter!(ax, ps, color = :white, markersize = 0.75)
scatter!(ax, map(l -> l.position[], lights), color = map(l -> l.color[], lights), strokewidth = 1, strokecolor = :black)
fig
using GLMakie
using GeometryBasics
ps = [
Point3f(cosd(phi) * cosd(theta), sind(phi) * cosd(theta), sind(theta))
for theta in range(-20, 20, length = 21) for phi in range(60, 340, length=30)
]
faces = [QuadFace(30j + i, 30j + mod1(i+1, 30), 30*(j+1) + mod1(i+1, 30), 30*(j+1) + i) for j in 0:19 for i in 1:29]
marker_mesh = GeometryBasics.mesh(ps, faces, normal = ps)
lights = [PointLight(RGBf(10, 4, 2), Point3f(0, 0, 0), 5)]
fig = Figure(size = (600, 600), backgroundcolor = :black)
ax = LScene(fig[1, 1], scenekw = (lights = lights,), show_axis = false)
update_cam!(ax.scene, ax.scene.camera_controls, Rect3f(Point3f(-2), Vec3f(4)))
meshscatter!(
ax, [Point3f(0) for _ in 1:14], marker = marker_mesh, markersize = 0.1:0.2:3.0,
color = :white, backlight = 1, transparency = false)
fig
聚光灯
using GLMakie
lights = [
SpotLight(RGBf(1, 0, 0), Point3f(-3, 0, 3), Vec3f(0, 0, -1), Vec2f(0.0, 0.3pi)),
SpotLight(RGBf(0, 1, 0), Point3f( 0, 3, 3), Vec3f(0, -0.5, -1), Vec2f(0.2pi, 0.25pi)),
SpotLight(RGBf(0, 0, 1), Point3f( 3, 0, 3), Vec3f(0, 0, -1), Vec2f(0.25pi, 0.25pi)),
]
fig = Figure(size = (600, 600))
ax = LScene(fig[1, 1], scenekw = (lights = lights,))
ps = [Point3f(x, y, 0) for x in -5:5 for y in -5:5]
meshscatter!(ax, ps, color = :white, markersize = 0.75)
scatter!(ax, map(l -> l.position[], lights), color = map(l -> l.color[], lights), strokewidth = 1, strokecolor = :black)
fig
直射灯,直射灯
using GLMakie
using FileIO, GeometryBasics, LinearAlgebra
# Create mesh from RectLight parameters
function to_mesh(l::RectLight)
n = -normalize(cross(l.u1[], l.u2[]))
p = l.position[] - 0.5 * l.u1[] - 0.5 * l.u2[]
positions = [p, p + l.u1[], p + l.u2[], p + l.u1[] + l.u2[]]
faces = GLTriangleFace[(1,2,3), (2,3,4)]
normals = [n,n,n,n]
return GeometryBasics.Mesh(positions, faces, normal = normals)
end
fig = Figure(backgroundcolor = :black)
# Prepare lights
lights = Makie.AbstractLight[
AmbientLight(RGBf(0.1, 0.1, 0.1)),
RectLight(RGBf(0.9, 1, 0.8), Rect2f(-1.9, -1.9, 1.8, 1.8)),
RectLight(RGBf(0.9, 1, 0.8), Rect2f(-1.9, 0.1, 1.8, 1.8)),
RectLight(RGBf(0.9, 1, 0.8), Rect2f( 0.1, 0.1, 1.8, 1.8)),
RectLight(RGBf(0.9, 1, 0.8), Rect2f( 0.1, -1.9, 1.8, 1.8)),
]
for l in lights
if l isa RectLight
angle = pi/4
p = l.position[]
Makie.rotate!(l, Vec3f(0, 1, 0), angle)
p = 3 * Vec3f(1+sin(angle), 0, cos(angle)) +
p[1] * normalize(l.u1[]) +
p[2] * normalize(l.u2[])
translate!(l, p)
end
end
# Set scene
scene = LScene(
fig[1, 1], show_axis = false,
scenekw=(lights = lights, backgroundcolor = :black, center = false),
)
# floor
msh = mesh!(scene, Rect3f(Point3f(-10, -10, 0.01), Vec3f(20, 20, 0.02)), color = :white)
translate!(msh, 0, 0, -5)
# Cat
cat_mesh = FileIO.load(Makie.assetpath("cat.obj"))
cat_texture = FileIO.load(Makie.assetpath("diffusemap.png"))
p2 = mesh!(scene, cat_mesh, color = cat_texture)
Makie.rotate!(p2, Vec3f(1,0,0), pi/2)
translate!(p2, -2, 2, -5)
scale!(p2, Vec3f(4))
#窗口/光源标记
在灯光下的l
如果l isa RectLight
网丝!(to_mesh(l),颜色=:白色,背光=1)
结束
结束
#放置相机
update_cam!(场景。场景,Vec3f(1.5,-13,2),Vec3f(1,-2,0),Vec3f(0,0,1))
无花果
┌ Error: obj file contains references to .mtl files, but none could be found. Expected: [\"cat.mtl\"] in /home/tnmoxa/work/package/Makie.jl/assets. └ @ MeshIO ~/.julia/packages/MeshIO/jBkmz/src/io/obj.jl:157"