speedtree8 seam blend贴图导入maya arnold5渲染接缝融合问题

这里使用的是speedtree8产生的树,这个版本的融合效果更好,而且pbr显示方式也使得查看实际制作效果更加方便

arnold使用版本是5.0 这以后版本都非常好用

maya版本2016-2017(版本最好要高)


首先是speedtree8已经支持导入到arnold5到中进行渲染

只要找到speedtree安装包里的插件(在安装目录的scripts\Maya里面找到py文件后maya 插件管理器直接browse这个文件即可)


然后maya里import的时候就会发现多了些格式(不是直接拖入)选arnold格式 注意5和非5是两种格式(导出的时候依然导出fbx会一起导出一个stmat文件)

导入stmat文件,这个会导入speedtree材质




但是发现个问题其他材质是有了,但是树木融合地方的所谓的seam blend片上没有融合材质的

这个就需要自己在里面做了

说下融合带一般就是树枝与主干之间环状的面片,融合的原理是图像的融合和光照norma的融合

可以参考这里http://docs.speedtree.com/doku.php?id=branchintersections

normal能导入正常,但是环状带需要一个渐变材质的融合,通过maya可以发现这个面片通常带有第二套uv

融合就靠这uv了,简单说就是这个片做个渐变,一半是主干材质,一半透明即可,或者自己刷顶点渐变也可以



下面先说下默认渲染器渲染融合带的问题

基本上自带材质混合贴图用blend color就可以了,上面的是默认渲染器渲染的,注意因为直接混合两种材质,没用透明,所以枝干部分不是很好

而且说下融合带默认主干地方是融合好的

ramp节点需要作用在第二套uv上(需要90度)

如下设置(arnold5渲染也是如此)


下面是用arnold5的方式

注意我这里因为开始测试的是顶点,当然最上面的节点可以换成ramp的(上面一个材质是透明的geometry里面的opacity(渲染物体不透明记得勾去掉))

混合用最新的aimixshader节点 很方便的

需要注意的是arnold渲染uv采样有问题需要缩放下,不要太靠边界否则如下面这样

假如缩放一点就好了(那条横线就是环带的第二套uv,纵向的不是径向的)

如下

最后结果

可以完美融合了



  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像最佳拼是一种常见的图像处理任务,通常用于将多张图像拼成一张更大的图像。其中一个重要的步骤就是在不同图像之间找到最佳的拼位置,并进行无。 这里介绍一种常用的图像最佳拼算法 - 动态规划,通过计算每个像素的能量值,找到能量值最小的路径,即为最佳拼。 实现步骤如下: 1. 计算每个像素的能量值,可以使用Sobel算子等常用算法。 2. 从第二行开始,计算每个像素的最小能量值和路径。 3. 最后一行的最小能量值即为最佳拼路径的总能量值。 4. 根据最佳拼路径,对图像进行拼。 Python代码实现如下: ```python import numpy as np from PIL import Image def energy(img): # 计算每个像素的能量值 gray = img.convert('L') sobel_x = np.array([[1, 0, -1], [2, 0, -2], [1, 0, -1]]) sobel_y = np.array([[1, 2, 1], [0, 0, 0], [-1, -2, -1]]) dx = gray.filter(ImageFilter.Kernel((3, 3), sobel_x.flatten())) dy = gray.filter(ImageFilter.Kernel((3, 3), sobel_y.flatten())) dx = np.array(dx) dy = np.array(dy) energy = np.sqrt(np.square(dx) + np.square(dy)) return energy def seam_carving(img, n): # 拼n张图像 imgs = [img] for i in range(n-1): img1 = imgs[-1].crop((0, 0, img.width // 2, img.height)) img2 = imgs[-1].crop((img.width // 2, 0, img.width, img.height)) e1 = energy(img1) e2 = energy(img2) for j in range(1, e1.shape[0]): for k in range(e1.shape[1]): if k == 0: e1[j][k] += min(e1[j-1][k], e1[j-1][k+1]) elif k == e1.shape[1] - 1: e1[j][k] += min(e1[j-1][k], e1[j-1][k-1]) else: e1[j][k] += min(e1[j-1][k-1], e1[j-1][k], e1[j-1][k+1]) for j in range(1, e2.shape[0]): for k in range(e2.shape[1]): if k == 0: e2[j][k] += min(e2[j-1][k], e2[j-1][k+1]) elif k == e2.shape[1] - 1: e2[j][k] += min(e2[j-1][k], e2[j-1][k-1]) else: e2[j][k] += min(e2[j-1][k-1], e2[j-1][k], e2[j-1][k+1]) path1 = np.zeros(e1.shape) path2 = np.zeros(e2.shape) for j in range(e1.shape[0]-1, -1, -1): if j == e1.shape[0]-1: path1[j][np.argmin(e1[j])] = 1 else: if np.argmin(e1[j]) == 0: path1[j][0] = 1 elif np.argmin(e1[j]) == e1.shape[1]-1: path1[j][-1] = 1 else: path1[j][np.argmin(e1[j])-1:np.argmin(e1[j])+2] = 1 for j in range(e2.shape[0]-1, -1, -1): if j == e2.shape[0]-1: path2[j][np.argmin(e2[j])] = 1 else: if np.argmin(e2[j]) == 0: path2[j][0] = 1 elif np.argmin(e2[j]) == e2.shape[1]-1: path2[j][-1] = 1 else: path2[j][np.argmin(e2[j])-1:np.argmin(e2[j])+2] = 1 path1 = np.expand_dims(path1, axis=-1) path2 = np.expand_dims(path2, axis=-1) img1 = np.array(img1) img2 = np.array(img2) img1 = np.concatenate((img1, path1), axis=-1) img2 = np.concatenate((img2, path2), axis=-1) img1 = Image.fromarray(np.uint8(img1)) img2 = Image.fromarray(np.uint8(img2)) img = Image.new('RGB', (img.width, img.height*2)) img.paste(img1, (0, 0)) img.paste(img2, (0, img.height)) imgs.append(img) # 根据路径进行拼 img = imgs[-1] for i in range(n-1): img1 = imgs[-i-2] path1 = np.array(img1)[:, :, -1] path2 = np.array(img)[:, :, -1] img1 = img1.crop((0, 0, img1.width - 1, img1.height)) img2 = img.crop((1, 0, img.width, img.height)) img1 = np.array(img1) img2 = np.array(img2) img1[:, np.where(path1 == 1)[1]] = img2[:, np.where(path2 == 1)[1]] img1 = Image.fromarray(np.uint8(img1)) img = img1 return img ``` 其中,seam_carving函数受两个参数,第一个参数是原始图像,第二个参数是需要拼的图像数量。该函数返回拼后的图像。 下面是一个示例,假设有两张800x800的图像,需要将它们拼成一张1600x800的图像: ```python img1 = Image.open('image1.jpg') img2 = Image.open('image2.jpg') img = seam_carving(img1, 1) img = seam_carving(img, 1) img.show() ``` 运行后,可以看到拼后的图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值