【学习填坑之路】VRay渲染之场景介绍及搭建

场景

1、最简单的场景包括这些插件以及参数:
【学习填坑之路】VRay渲染之场景介绍及搭建_第1张图片

  • RenderView定义相机来拍摄光线。每个场景都必须有一个RenderView插件。
  • LightDome定义场景中的光源否则一切都是黑色的
  • 创建一个Node插件包括材质和几何体的几何参数和材质参数,场景中应该至少有一个几何对象(这是一个GeomStaticMesh的Node插件)。使用了MtlSingleBRDF来定义材质,但还有更多的材质和BRDF类型。

2、静态几何:
因为三角形更快交叉,所以V-Ray中的几何图形由三角形网格表示,而不支持任意多边形。
几何的分类:

  • 隐式几何 - 它具有分析定义。这方面的例子是GeomInfinitePlane和GeomSphere 插件。
  • 静态几何体(三角形) - 在渲染之前显式定义三角形网格,并在整个渲染过程中保留在内存中。
  • 动态几何 - 基元在运行时在需要时生成,可以被丢弃以释放内存。包括头发和毛皮,细分曲面,NURBS代理

3、Node插件:
在定义实际几何数据之前,将几何数据(几何参数)与材质插件(材质参数)链接,并将其定位在世界中(变换参数)的。您可以在不同位置从不同节点引用相同的几何体,而无需复制数据

Geometry几何体分类:

  • GeomStaticMesh - 基本的静态几何体。需要顶点和普通数据以及可选的UVW纹理贴图坐标。V-Ray静态网格物体仅适用于三角形几何体,因此如果您有更大的多边形,则必须对它们进行三角测量。最简单的方法是凸多边形的耳剪方法。如果您正在查看三角形的正面,则在V-Ray的几何数组中以逆时针顺序指定三角形顶点索引。
  • GeomStaticSmoothedMesh - 引用另一个网格插件(通常是GeomStaticMesh)并生成一个平滑的细分版本。
  • GeomDisplacedMesh - 引用另一个网格插件(通常是GeomStaticMesh)并使用纹理贴图生成移位版本。
  • GeomStaticNURBS - 使用控制顶点和权重定义平滑的NURBS曲面。
    GeomHair - 引用另一个网格插件(通常是GeomStaticMesh)并生成头发(可以调整毛发,草,毛茸茸的地毯等)。该插件有许多关于股线的大小,形状和分布的参数。这对应于3dsMax和Maya中的VRayFur。
  • GeomMeshFile - 从文件加载几何体,也叫几何代理。几何体仅在光线照射时按需加载,因此在某些情况下(例如分布式桶渲染)可能会阻止不必要的计算和内存使用。目前支持的格式是V-Ray的.vrmesh和Alembic .abc。如果您有其他格式的文件,例如.obj,则需要使用ply2vrmesh工具进行转换。
  • GeomParticleSystem - 生成许多(通常很小的)粒子。

其中具体以GeoStaticMesh来说,需要必须设置的是:

  • 顶点 - 具有对象空间中顶点坐标的VectorList。
  • faces - IntList类型,其顶点数组中包含索引。每三个指数构成一个三角形。可以多次使用相同的顶点索引(对于它所属的不同三角形)。
  • 法线 - 在对象空间中具有法线向量的VectorList。这些可以与顶点具有不同的计数。
  • faceNormals - intList类型,即索引法线数组。每个索引都定义了faces数组中相应顶点的法线。
    除此之外,还有map_channels,face_mtllDs,smooth_uv等
ex3.1
import vray
with vray.VRayRenderer() as renderer:
    # Create a new static geometry
    mesh = renderer.classes.GeomStaticMesh()
    # Assign a cube geometry
    mesh.vertices=vray.List([
        vray.Vector(-10, -20, 0.0), 
        vray.Vector(10, -20, 0.0), 
        vray.Vector(-10, 20, 0.0), 
        vray.Vector(10, 20, 0.0), 
        vray.Vector(-10, -20, 20), 
        vray.Vector(10, -20, 20), 
        vray.Vector(-10, 20, 20), 
        vray.Vector(10, 20, 20)
    ])
    mesh.faces=vray.List([
        0, 2, 3, 
        3, 1, 0, 
        4, 5, 7, 
        7, 6, 4, 
        0, 1, 5, 
        5, 4, 0, 
        1, 3, 7, 
        7, 5, 1, 
        3, 2, 6, 
        6, 7, 3, 
        2, 0, 4, 
        4, 6, 2
    ])
    mesh.normals=vray.List([
        vray.Vector(0.0, 0.0, -1.0), vray.Vector(0.0, 0.0, -1.0), vray.Vector(0.0, 0.0, -1.0), 
        vray.Vector(0.0, 0.0, -1.0), vray.Vector(0.0, 0.0, -1.0), vray.Vector(0.0, 0.0, -1.0), 
        vray.Vector(0.0, 0.0, 1.0), vray.Vector(0.0, 0.0, 1.0), vray.Vector(0.0, 0.0, 1.0), 
        vray.Vector(0.0, 0.0, 1.0), vray.Vector(0.0, 0.0, 1.0), vray.Vector(0.0, 0.0, 1.0), 
        vray.Vector(0.0, -1.0, 0.0), vray.Vector(0.0, -1.0, 0.0), vray.Vector(0.0, -1.0, 0.0), 
        vray.Vector(0.0, -1.0, 0.0), vray.Vector(0.0, -1.0, 0.0), vray.Vector(0.0, -1.0, 0.0), 
        vray.Vector(1.0, 0.0, 0.0), vray.Vector(1.0, 0.0, 0.0), vray.Vector(1.0, 0.0, 0.0), 
        vray.Vector(1.0, 0.0, 0.0), vray.Vector(1.0, 0.0, 0.0), vray.Vector(1.0, 0.0, 0.0), 
        vray.Vector(0.0, 1.0, 0.0), vray.Vector(0.0, 1.0, 0.0), vray.Vector(0.0, 1.0, 0.0), 
        vray.Vector(0.0, 1.0, 0.0), vray.Vector(0.0, 1.0, 0.0), vray.Vector(0.0, 1.0, 0.0), 
        vray.Vector(-1.0, 0.0, 0.0), vray.Vector(-1.0, 0.0, 0.0), vray.Vector(-1.0, 0.0, 0.0), 
        vray.Vector(-1.0, 0.0, 0.0), vray.Vector(-1.0, 0.0, 0.0), vray.Vector(-1.0, 0.0, 0.0)
    ])
    mesh.faceNormals=vray.List([
        0, 1, 2, 
        3, 4, 5, 
        6, 7, 8, 
        9, 10, 11, 
        12, 13, 14, 
        15, 16, 17, 
        18, 19, 20, 
        21, 22, 23, 
        24, 25, 26, 
        27, 28, 29, 
        30, 31, 32, 
        33, 34, 35
    ])
 
    # Create a BRDF with diffuse color
    newBRDF = renderer.classes.BRDFDiffuse()
    # We specify solid red color
    newBRDF.color = vray.Color(1.0, 0.0, 0.0)
 
    # Create a new material with single BRDF
    newMaterial = renderer.classes.MtlSingleBRDF()
    # Assign the BRDF to the material
    newMaterial.brdf = newBRDF
 
    # Create a new node for the cube
    newNode = renderer.classes.Node()
    newNode.material = newMaterial     # Assign the new material to the new node
    newNode.geometry = mesh            # Assign the mesh
    # We must specify transform in order to position the cube in the world
    newNode.transform = vray.Transform(vray.Matrix(vray.Vector(1.0, 0.0, 0.0),
                            vray.Vector(0.0, 1.0, 0.0),
                            vray.Vector(0.0, 0.0, 1.0)), vray.Vector(-50, 100, 0))
 
    # Create the light
    light = renderer.classes.LightRectangle()
    # We must specify transform in order to position the light in the world
    light.transform = vray.Transform(vray.Matrix(vray.Vector(1.0, 0.0, 0.0),
                            vray.Vector(0.0, 1.0, 0.0),
                            vray.Vector(0.0, 0.0, 1.0)), vray.Vector(-50, 100, 150))
    # Set white color
    light.color = vray.Color(1.0, 1.0, 1.0)
    # Increase the light's size (by default it's 1x1)
    light.u_size = 50
    light.v_size = 50
    # Increase the default intensity
    light.intensity = 100
 
    # Create the camera
    renderView = renderer.classes.RenderView()
    # Position the camera towards the cube
    renderView.transform=vray.Transform(vray.Matrix(vray.Vector(1.0, 0.0, 0.0), vray.Vector(0.0, 0.0, 1.0), vray.Vector(0.0, -1.0, 0.0)), vray.Vector(50, -150, 50))
    # Set Field of view (horizontal) in radians
    renderView.fov=2
 
    renderer.start()
    renderer.waitForRenderEnd(6000)

4、渲染视图RenderView

相机的主要三个参数为:

  • 以弧度表示的水平视野fov(Vray的fov与Unreal4的FOV不同)
  • 允许使用正交投影orthographic
  • 旋转加平移的transform:用于定义摄像机的位置以及旋转方式。矩阵采用列主格式,您需要自己计算或者调用MakeRotationMatrixX方法写一个函数来设定。您无法像在大多数3D软件中那样设置旋转角度。带有单位矩阵的默认摄像机方向是+ Z指向上方,+ Y是视图方向。对于高级相机效果,如DoF,曝光,失真,渐晕等,除了RenderView之外,还需要启用物理相机。也可以通过改变得到不同的相机类型,如鱼眼等类型的使用SettingsCamera。

你可能感兴趣的:(VRay_SDK)