C4D腳本:根據圖片大小建立平面並賦予貼圖
最近手頭的項目需要大量的在C4D里導入圖片並貼到平面上,為了保證比例正確還得設置平面的寬高匹配圖片的寬高,十分繁瑣,於是仗著自己有AE腳本開發的基礎,擼(da)起(kai)袖(gu)子(ge)東拼西湊寫了人生中第一個C4D腳本。
https://www.zhihu.com/video/943264048666640384如果你恰巧也有這方面的需求,歡迎下載使用:
C4D腳本下載:根據圖片大小建立平面並賦予貼圖安裝方法:
將下載的「根據圖片大小建立平面並賦予貼圖.py」文件放入C4D安裝目錄下的library -> script 文件夾里。
或者運行C4D,點擊「腳本」->「用戶腳本」-> 「腳本目錄」,將文件放進 script 文件夾里。
如何使用:
首先把要導入的圖片放到一個文件夾里。
然後運行C4D,點擊「腳本」->「用戶腳本」-> 「根據圖片大小建立平面並賦予貼圖」,在彈出的對話框中選擇圖片所在的文件夾,點擊「打開」。
腳本代碼:
C4D的腳本是用python寫的,第一次寫python,參考了網上很多前輩們代碼,高手們輕噴哈~
我寫了些注釋,感興趣的可以看下,請搭配「官方SDK文檔」食用~
# 根據圖片大小建立平面並賦予貼圖# xixi@bigxixi.comimport osimport c4dfrom c4d import documents, plugins, bitmaps# 區分 win 和 mac 文件地址osSlash = /if os.name == nt: osSlash = \# 選擇一個文件夾imgDir = c4d.storage.LoadDialog(c4d.FILESELECTTYPE_ANYTHING,"選擇資源文件夾",c4d.FILESELECT_DIRECTORY, "", "") + osSlash# 獲取所選文件夾下的圖片文件imgs = os.listdir(imgDir)for fichier in imgs[:]: # filelist[:] 複製一份文件地址,防止誤刪原文件 if not(fichier.endswith((".png",".jpg",".gif",".PNG",".JPG",".GIF",".JPEG",".jpeg"))): imgs.remove(fichier)def main(): # 定義一個函數,根據傳入的文件名生成以該文件長、寬生成平面並將圖片賦予貼圖 def texPoly(name,count): fullPath = imgDir + name # 獲取圖片完整路徑 pName = fullPath.split(osSlash)[-1].split(.)[0] # 獲取圖片文件名 bm = bitmaps.BaseBitmap() # 新建貼圖 bm.InitWith(fullPath) xy = bm.GetSize() # 獲取長、寬 c4d.CallCommand(5168, 5168) # 新建一個平面 obj = doc.GetActiveObject() # 獲取新建的平面 obj.SetName(pName) # 設置平面物體 obj[c4d.PRIM_AXIS] = 5 # 豎起來 obj[c4d.PRIM_PLANE_SUBW] = 1 # 細分設為1(無細分) obj[c4d.PRIM_PLANE_SUBH] = 1 obj[c4d.PRIM_PLANE_WIDTH] = xy[0] # 設置長寬 obj[c4d.PRIM_PLANE_HEIGHT] = xy[1] # 設置位置 obj[c4d.ID_BASEOBJECT_REL_POSITION,c4d.VECTOR_Z] = count*offset # z向間隔隔開 c4d.CallCommand(12236) # 轉為可編輯面片 # 創建一個材質 mat = c4d.BaseMaterial(c4d.Mmaterial) mat.SetName(pName) # 與圖片同名 doc.InsertMaterial(mat) # 將新建的材質放到材質列表 # 新建2個著色器,分別賦予到「色彩」和「Alpha」通道。如果共用一個著色器渲染會出錯。 sha = c4d.BaseList2D(c4d.Xbitmap) shaA = c4d.BaseList2D(c4d.Xbitmap) sha[c4d.BITMAPSHADER_FILENAME] = fullPath shaA[c4d.BITMAPSHADER_FILENAME] = fullPath mat.InsertShader(sha) mat.InsertShader(shaA) mat[c4d.MATERIAL_COLOR_SHADER] = sha mat[c4d.MATERIAL_ALPHA_SHADER] = shaA mat[c4d.MATERIAL_USE_ALPHA] = True # 啟用alpha通道 # 更新材質 mat.Message( c4d.MSG_UPDATE ) mat.Update( True, True ) # 創建一個材質標籤 tag = c4d.BaseTag( c4d.Ttexture ) tag[c4d.TEXTURETAG_MATERIAL] = mat tag[c4d.TEXTURETAG_PROJECTION] = 6 # 將材質標籤貼到剛才創建的平面物體 obj.InsertTag(tag) offset = 100 # 創建的每張圖片距離 imgCount = 0 # 圖片數量 # 對所選文件夾里的圖片文件都做相同操作(不包括子文件夾) for imgName in imgs: imgCount += 1 texPoly(imgName,imgCount)if __name__==__main__: main() c4d.EventAdd()
推薦閱讀:
※知識到底值多少錢?
※如何學習 Motion Graphic 製作?
※大家有好的Motion graphic片子適合<拉片>用的嗎?
※「只要功夫深 不用關鍵幀」之數字動畫的玩法
※知乎未登錄時背景的動態效果是如何實現的「Three.js線材質」
TAG:MaxonCinema4D | Python | 动态图形设计 |