Vray渲染器之家装户型渲染实战记录
简要介绍:
首先思路是分为客户端、服务器、中间件三大块。先从客户端传入json文件给包括mesh,灯光,模型的中间件,其中mesh和灯光可以用已有的API调用服务器的内容,然后调用模型中包含的json文件包括对应的ID号、三维信息,这些信息通过访问数据库中的vrscenes文件(或者max文件)来获取对应的其他参数,然后生成对应的场景文件;最后实现的效果非常好。
第一步:环境设置
1、语言选择:
- vray渲染编程支持C++,python等语言。因为没有正式开发所以暂时使用python编写的。
2、下载VRaySDK:
- 进入开发者主页:https://docs.chaosgroup.com/display/LIC5/Installing+the+License+Server
- 点进入下载主页:https://download.chaosgroup.com/?product=48&release_type=official_release点最下面倒数第二个下载
- 选择对应的系统版本下载即可:
- 不同系统的安装位置参考:
- 安装后,输入自己的账户密码登入账户即可,如果没有购买可以申请试用期1-3个月不等,购买需要购买至少一个渲染节点和至少一个渲染服务器:
- 命令行安装等其他参考官方文档。
- 登入自己的本机地址localhost:30304查看证书和使用证书这里会显示你的使用状况,使用人数,使用期限,购买了哪些证书。
- 如果要换用户点击disable然后在重新登录即可:
2、库文件载入:
- 本机系统是macOS,相对Windows会麻烦一些,Windows只需将/ChaosGroup/VRay/AppSDk/python27/vray文件拷入工程中即可。而macOS在自己搞鼓和询问官方后得出的最简单的方式是直接在py文件开始处加入一句以下语句即可:
vray.setSDKLibraryPath("/Applications/ChaosGroup/V-Ray/AppSDK/bin") - 还有就是在测试中Python2.7支持较好,建议使用该版本开发。
3、配置环境参数:
一部分会在安装VRay的时候就有,其他一部分自己添加
- PYTHONPATH=:/Applications/ChaosGroup/V-Ray/AppSDK/python27
- VRAY_OSL_PATH=/Applications/ChaosGroup/V-Ray/AppSDK/bin
- VRAY_MDL_PATH=/Applications/ChaosGroup/V-Ray/Standalone_for_mavericks_x64/mdl
- VRAY_PATH=:/Applications/ChaosGroup/V-Ray/Standalone_for_mavericks_x64/bin/mavericks_x64/gcc-4.2-cpp
- VRAY_SDK=/Applications/ChaosGroup/V-Ray/AppSDK
- VRAY_SEND_FEEDBACK=1
第二步、读取文件中的数据并简单建模
1、建一个house类:
- 其中包括house字典和camera,walls,lights,models列表。使用常规的文件读取操作即可,然后初始化:
def __init__(self, filename): with open(filename) as f:self.house = json.load(f)
2、读取json文件参数并实现房间的基本模型:
- 编写一个日志函数可以返回相关的进程参数和报错:
def dumpMsg(renderer, message, level, instant):if level == vray.LOGLEVEL_ERROR:print("[ERROR]", message)elif level == vray.LOGLEVEL_WARNING:print("[Warning]", message)elif level == vray.LOGLEVEL_INFO:print("[info]", message)
renderer.setOnLogMessage(dumpMsg)
- 调用house类读取json文件:
DEMO_house = json2vr.House("./json/name.json")
- 依次循坏读入对应的定点坐标数据并修改他们的名称方便调用然后生成node节点包括他的mesh和材质(后面讲),
for i in range(len(walls)):string1 = 'wall_' + str(i) + '_node'string2 = 'mesh_' + str(i) + '_node'mesh.append(renderer.classes.GeomStaticMesh(string2))
- 这里最关键的就是setWall函数用来生成基础的墙体,用顶点个数来做循环次数,分别读取对应json文件的嵌套列表中的坐标数据存入对应的列表中,准线法线等同理,然后把读取的数据传给我们创建的node中的mesh等对应数据中即可,这里VRay要求这4个参数是必须设置的,这里还添加了UV的相关数据是为以后贴图使用的,还有就是对于VRay的坐标轴来说是一个右手坐标系:
for i in range(len(wall["Vertices"])):x = wall["Vertices"][i]["x"]y = wall["Vertices"][i]["y"]z = wall["Vertices"][i]["z"]point = vray.Vector(x, y, z)vertices_list.append(point)
- 整个VRay的坐标设置查了很久资料,第一种方法是利用计算机图形学的里面的三维坐标变换法则即利用三维变化矩阵进行操作
,大致原理是:
由于用齐次坐标表示,三维几何变换的矩阵是一个4阶方阵,其形式如下:
其中产生按轴缩放、旋转、错切等变换。产生平移变换,产生投影变换,产生整体的缩放变换。这样的话转换起来相当复杂。所以有了第二种方法使用内置的makeRotation()函数进行操作,只需提供一个接口获取旋转,大小比例,坐标的数值即可获取位置,省去了矩阵运算的过程。
def make_transform(rotX=0, rotY=0, rotZ=0, scale=1, offset=vray.Vector()):mS = vray.Matrix(scale)mX = vray.Matrix.makeRotationMatrixX(rotX)mY = vray.Matrix.makeRotationMatrixY(rotY)mZ = vray.Matrix.makeRotationMatrixZ(rotZ)transform = vray.Transform(mS * mZ * mY * mX, offset)return transform
3、设置相机和灯光
- 在3维的世界里,相机就相当于人的眼睛,相机的设置是相当的关键的。VRay的坐标轴是右手系,并且初始的方向是Z轴朝下,顺着角度的增大做逆时针的旋转,其中的三个旋转参数分别代表了绕x,y,z轴旋绕,具体来看就是上下旋转,左右旋转,自身旋转。这里是使用的全景相机,如果使用常规相机则去掉settingsCamera的属性即可,fov属性是视场角的大小决定了光学仪器的视野范围,视场角越大,视野就越大,光学倍率就越小。通俗地说,目标物体超过这个角就不会被收在镜头里,VRay里的fov属性与unity和unreal的有一定的区别,他们之间有一定的转换是1:100,全景相机将fov值设为2pi即可,其他属性在前面的博客有讲解。补充:官方的说法只明确了VRAY渲染+Y表示上轴,左右应该是X轴,而前后是Y轴,相机的-Z轴方向是相机的取景方向,至于物体的正方向应该也是-Z轴。和博主在开发上有一些出入所以还是根据实际情况来调整。
- 灯光的函数在以前讲过这里直接就写进来,不同的灯光写成不同的函数,可以使用重载。这里的invisible属性非常重要,当我们的相机设置的位置处于灯后的话我们看到的就是一片漆黑,这里有两个方法,一个方法是使用invisble()使其透视
light = renderer.classes.LightRectangle()
lightPos = vray.Vector(0, 0, 270)
light.transform = make_transform(0, 0, 0, 1, lightPos)
light.color = vray.Color(1, 1, 1)
light.u_size = 500
light.v_size = 500
light.intensity = 2
light.invisible = 0
第二个是使用全局灯光模式,具体的属性见上。
gi = renderer.classes.SettingsGI.getInstanceOrCreate()
gi.on = True
gi.primary_engine = 0
gi.secondary_engine = 3
第三步、墙体的材质和贴图
-
材质的设置一般分为初始化材质和使用时修改。用法都基本相同,只是初始化在墙体生成的时候就调用该函数根据自己的材质进行设置即可,建议使用VRay内置提供的材质初始化。
-
在材质上我们既可以使用内置的材质,也可以还是使用简单的颜色组合赋给BRDF然后覆盖material属性
newBRDF = renderer.classes.BRDFDiffuse()
newBRDF.color = vray.AColor(r, g, b, a)
newMaterial = renderer.classes.MtlSingleBRDF()
newMaterial.brdf = newBRDF
renderer.plugins[node].material = newMaterial
或者获取对性的贴图,在VRay里面使用贴图都需要借助bitmap来进行设置贴图属性之后赋给材质然后设置diffiuse和reflect两个必要的参数,加上一些可选的设置,包括反光度,透光度等等,
newBRDF = renderer.classes.BRDFDiffuse()
newBRDF.color = vray.AColor(r, g, b, a)
newMaterial = renderer.classes.MtlSingleBRDF()
newMaterial.brdf = newBRDF
renderer.plugins[node].material = newMaterial
第四步、导入家具物体
- 家具的物体主要是通过获取vrscene中的对应家具数据,在使用数据之前需要先对vrscene中的数据进行处理去掉出了材质之外的其他不相关数据,因为其他数据都是我们自己设置嘛。
renderer.load(filename)
del renderer.plugins['setting']
获取对应数据重新建立一个node将对应vrscene的position,mesh,贴图全部赋进去即可。VRay值支持读取一个vrscene后面的会覆盖前面的,所以官方采用不同的物体的vrscene放在一个统一的vrscene里一起导入即可,再删除原来初始化的node即可
table = renderer.classes.Node()
table.geometry = renderer.plugins[geometry]
os.chdir(path)
table.material = material1
table.transform = make_transform(rotX, rotY, rotZ, scale, offset)
第五步 导出保存图片
- VRay渲染器CPU的渲染10分钟左右就差不多到底了,再长时间效果改善不大,GPU则在合理范围内时间越长效果越好。
renderer.startSync()
renderer.waitForRenderEnd(20000)
renderer.export("exportAll.vrsence")
image = renderer.getImage()
image.save("name.jpg")
*这里到导出设置上询问了官方,给出的解决方案是和unreal里导出属性相同的compressed和hexArrays属性。
RayExportSettings settings;
setting.compressed = false;
setting.hexArrays = false;
vrayRendrer.exportScene(''filename.vrscene'',settings);