Browse Source

c4d export

George Profenza 14 năm trước cách đây
mục cha
commit
61d7fe9575

BIN
utils/exporters/.DS_Store


BIN
utils/exporters/cinema4d/.DS_Store


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 0
utils/exporters/cinema4d/Three.js


+ 189 - 0
utils/exporters/cinema4d/export_to_three.js.py

@@ -0,0 +1,189 @@
+'''
+author : "George Profenza"
+url    : ("disturb", "disturbmedia.com/blog","My blog, http://tomaterial.blogspot.com")
+
+Export meshes the three.js 3D Engine by mr.doob's et al.
+
+More details on the engine here:
+https://github.com/mrdoob/three.js
+
+Currently supports UVs. If the model doesn't display correctly
+you might need to reverse some normals/do some cleanup.
+Also, if you use Selection Tags and basic ColorMaterials, 
+the colours will be picked up as face colors. Call autoColor() on the
+model you use for this.
+The mesh transformations(position, rotation, scale) are saved
+and you can get them using: getPosition(), getRotation() and getScale()
+each returning a THREE.Vector3
+
+In short
+var myGeom = new myC4DGeom();
+var myModel = new THREE.Mesh( myGeom, new THREE.MeshFaceMaterial());
+//set transforms
+model.position = myGeom.getPosition()
+model.rotation = myGeom.getRotation()
+model.scale    = myGeom.getScale()
+//set selection tags colours
+myGeom.autoColor()
+
+More details on this exporter and more js examples here:
+https://github.com/orgicus/three.js
+
+Have fun!
+
+This script requires Cinema 4D R11.5 minimum and the Py4D Plugin:
+http://www.py4d.com/get-py4d/
+'''
+
+import c4d
+from c4d import documents,UVWTag,storage
+from c4d.utils import *
+from c4d import symbols as sy, plugins, utils, bitmaps, gui
+import math
+import re
+
+# utils
+clean = lambda varStr: re.sub('\W|^(?=\d)','_', varStr)
+# from Active State's Python recipies: http://code.activestate.com/recipes/266466-html-colors-tofrom-rgb-tuples/
+def RGBToHTMLColor(rgb_tuple):
+    return '0x%02x%02x%02x' % rgb_tuple
+def Export():
+    if not op: return
+    if op.GetType() != 5100:
+            print 'Selected Object is not an editable mesh'
+            return
+    unit = 0.001#for scale
+    fps   = doc.GetFps()
+    bd = doc.GetRenderBaseDraw()
+    scr = bd.GetFrameScreen()
+    rd = doc.GetActiveRenderData()
+    name  = op.GetName()
+    classname = clean(name)
+    
+    c4dPath = c4d.storage.GeGetC4DPath(sy.C4D_PATH_LIBRARY)
+    jsFile = open(c4dPath+'/scripts/Three.js','r')
+    js = jsFile.read()
+    htmlFile = open(c4dPath+'/scripts/template.html','r')
+    html = htmlFile.read()
+    html = html.replace('%s',classname)
+    code  = 'var %s = function () {\n\n\tvar scope = this;\n\n\tTHREE.Geometry.call(this);\n\n' % classname
+    
+    def GetMesh(code):
+        # goto 0
+        doc.SetTime(c4d.BaseTime(0, fps))
+        c4d.DrawViews( c4d.DA_ONLY_ACTIVE_VIEW|c4d.DA_NO_THREAD|c4d.DA_NO_REDUCTION|c4d.DA_STATICBREAK )
+        c4d.GeSyncMessage(c4d.EVMSG_TIMECHANGED)
+        doc.SetTime(doc.GetTime())
+        c4d.EventAdd(c4d.EVENT_ANIMATE)
+        SendModelingCommand(command = MCOMMAND_REVERSENORMALS, list = [op], mode = MODIFY_ALL, bc = c4d.BaseContainer(), doc = doc)
+        
+        verts = op.GetPointAll()
+        for v in verts:
+            code += '\tv( %.6f, %.6f, %.6f );\n' % (v.x, -v.y, v.z)
+        code += '\n'
+        ncount = 0
+        uvcount = 0
+        faces = op.GetAllPolygons()
+        normals = op.CreatePhongNormals()
+        ndirection = 1
+        hasUV = False
+        for tag in op.GetTags():
+            if tag.GetName() == "UVW":
+                uvw = tag
+                hasUV = True
+        for f in faces:
+            if(f.d == f.c):
+                if(normals):
+                    code += '\tf3( %d, %d, %d, %.6f, %.6f, %.6f );\n' % (f.a, f.b, f.c, normals[ncount].x*ndirection, normals[ncount].y*ndirection, normals[ncount].z*ndirection)
+                else:
+                    code += '\tf3( %d, %d, %d );\n' % (f.a, f.b, f.c)
+            else:
+                if(normals):
+                    code += '\tf4( %d, %d, %d, %d, %.6f, %.6f, %.6f );\n' % (f.a, f.b, f.c, f.d, normals[ncount].x*ndirection, normals[ncount].y*ndirection, normals[ncount].z*ndirection)
+                else:
+                    code += '\tf4( %d, %d, %d, %d );\n' % (f.a, f.b, f.c, f.d)
+            if hasUV:
+                uv = uvw.Get(uvcount);
+                # uvs  += '[Vector('+str(uv[0].x)+','+str(1.0-uv[0].y)+'),Vector('+str(uv[1].x)+','+str(1.0-uv[1].y)+'),Vector('+str(uv[2].x)+','+str(1.0-uv[2].y)+')],'
+                if len(uv) == 4:
+                    code += '\tuv( %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f);\n' % (uv[0].x, uv[0].y, uv[1].x, uv[1].y, uv[2].x, uv[2].y, uv[3].x, uv[3].y)
+                else:
+                    code += '\tuv( %.6f, %.6f, %.6f, %.6f, %.6f, %.6f);\n' % (uv[0].x, uv[0].y, uv[1].x, uv[1].y, uv[2].x, uv[2].y)
+                ncount += 1
+                uvcount += 1
+            
+        #selection color
+        code +='\n\tscope.colors = {};\n'
+        code +='\tscope.selections = {};\n'
+        selName = ''
+        for tag in op.GetTags():  
+            if(tag.GetType() == 5616): #texture tag
+               material = tag.GetMaterial()
+               color = material[sy.MATERIAL_COLOR_COLOR]
+               tag.SetBit(c4d.BIT_ACTIVE)
+               selName = clean(tag[sy.TEXTURETAG_RESTRICTION])
+               if len(selName) == 0:    print "*** WARNING! *** Missing selection name for material: " + material.GetName()
+               code += '\tscope.colors["'+selName+'"] = '+str(RGBToHTMLColor((color.x*255,color.y*255,color.z*255)))+';\n'
+            if tag.GetType() == 5673:  #selection tag
+               # print 'selection: ' + tag.GetName()  
+               sel = tag.GetSelection()
+               selName = clean(tag.GetName())
+               ids = sel.GetAll(op.GetPointCount())
+               indices = [i for i, e in enumerate(ids) if e != 0]
+               code += '\tscope.selections["'+selName+'"] = '+str(indices)+';\n'
+               
+        code += '\n\tscope.autoColor = function(){\n'
+        code += '\t\tfor(var s in this.selections){\n'
+        code += '\t\t\tfor(var i = 0 ; i < this.selections[s].length; i++) this.faces[this.selections[s][i]].material = [ new THREE.MeshColorFillMaterial( this.colors[s],1) ];\n'
+        code += '\t\t}\n\t}\n'
+        
+        # model position, rotation, scale               rotation x,y,z = H,P,B => three.js x,y,z is P,H,B => y,x,z
+        p = op.GetPos()
+        r = op.GetRot()
+        s = op.GetScale()
+        code += '\n\tscope.getPosition = function(){\treturn new THREE.Vector3'+str((p.x,p.y,p.z))+';\t}\n'
+        code += '\n\tscope.getRotation = function(){\treturn new THREE.Vector3'+str((r.y,r.x,r.z))+';\t}\n'
+        code += '\n\tscope.getScale = function(){\treturn new THREE.Vector3'+str((s.x,s.y,s.z))+';\t}\n'
+        
+        code += '\n'
+        code += '\tfunction v( x, y, z ) {\n\n'
+        code += '\t\tscope.vertices.push( new THREE.Vertex( new THREE.Vector3( x, y, z ) ) );\n\n'
+        code += '\t}\n\n'
+        code += '\tfunction f3( a, b, c, nx, ny, nz ) {\n\n'
+        code += '\t\tscope.faces.push( new THREE.Face3( a, b, c, nx && ny && nz ? new THREE.Vector3( nx, ny, nz ) : null ) );\n\n'
+        code += '\t}\n\n'
+        code += '\tfunction f4( a, b, c, d, nx, ny, nz ) {\n\n'
+        code += '\t\tscope.faces.push( new THREE.Face4( a, b, c, d, nx && ny && nz ? new THREE.Vector3( nx, ny, nz ) : null ) );\n\n'
+        code += '\t}\n\n'
+        code += '\tfunction uv( u1, v1, u2, v2, u3, v3, u4, v4 ) {\n\n'
+        code += '\t\tvar uv = [];\n'
+        code += '\t\tuv.push( new THREE.UV( u1, v1 ) );\n'
+        code += '\t\tuv.push( new THREE.UV( u2, v2 ) );\n'
+        code += '\t\tuv.push( new THREE.UV( u3, v3 ) );\n'
+        code += '\t\tif ( u4 && v4 ) uv.push( new THREE.UV( u4, v4 ) );\n'
+        code += '\t\tscope.uvs.push( uv );\n'
+        code += '\t}\n\n'
+        code += '}\n\n'
+        code += '%s.prototype = new THREE.Geometry();\n' % classname
+        code += '%s.prototype.constructor = %s;' % (classname, classname)
+        
+        SendModelingCommand(command = MCOMMAND_REVERSENORMALS, list = [op], mode = MODIFY_ALL, bc = c4d.BaseContainer(), doc = doc)
+        
+        return code
+
+    code = GetMesh(code)
+    docPath = doc.GetDocumentPath() 
+    jspath = docPath+'/'+classname+'.js'
+    htmlpath = docPath+'/'+classname+'.html'
+    file = open(jspath,'w')
+    file.write(code)
+    file.close()
+    file = open(htmlpath,'w')
+    file.write(html)
+    file.close()
+    file = open(docPath+'/Three.js','w')
+    file.write(js)
+    file.close()
+    print 'Export Complete!'
+
+Export()

+ 108 - 0
utils/exporters/cinema4d/template.html

@@ -0,0 +1,108 @@
+<!DOCTYPE HTML>
+<html lang="en">
+	<head>
+		<title>three.js - geometry - %s</title>
+		<meta charset="utf-8">
+		<style type="text/css">
+			body {
+				color: #808080;
+				font-family:Monospace;
+				font-size:13px;
+				text-align:center;
+
+				background-color: #ffffff;
+				margin: 0px;
+				overflow: hidden;
+			}
+
+			#info {
+				position: absolute;
+				top: 0px; width: 100%;
+				padding: 5px;
+			}
+
+			a {
+
+				color: #0080ff;
+			}
+
+		</style>
+	</head>
+	<body>
+
+		<div id="container"></div> 
+		<div id="info"><a href="http://github.com/mrdoob/three.js" target="_blank">Using three.js - %s</a></div>
+		<script type="text/javascript" src="Three.js"></script>
+		<script type="text/javascript" src="%s.js"></script>
+
+		<script type="text/javascript">
+
+			var SCREEN_WIDTH = window.innerWidth, SCREEN_HEIGHT = window.innerHeight;
+
+			var container, stats;
+
+			var camera, scene, renderer;
+
+			var mesh;
+
+			var mouseX = 0;
+			var mouseY = 0;
+
+			var windowHalfX = window.innerWidth / 2;
+			var windowHalfY = window.innerHeight / 2;
+
+
+			init();
+			setInterval( loop, 1000 / 60 );
+
+
+			function init() {
+
+				container = document.getElementById( 'container' );
+
+				camera = new THREE.Camera( 60, SCREEN_WIDTH / SCREEN_HEIGHT, 0.0001, 10000 );
+				camera.position.z = 500;
+
+				scene = new THREE.Scene();
+				
+				var geom = new %s();
+				geom.autoColor();
+				mesh = new THREE.Mesh( geom, new THREE.MeshFaceMaterial() );
+				mesh.position = geom.getPosition();
+				mesh.rotation = geom.getRotation();
+				mesh.scale = geom.getScale();
+				scene.addObject(mesh);
+
+				renderer = new THREE.CanvasRenderer();
+				renderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
+
+				container.appendChild(renderer.domElement);
+
+				document.addEventListener('mousemove', onDocumentMouseMove, false);
+
+			}
+
+			
+			function onDocumentMouseMove( event ) {
+
+				mouseX = ( event.clientX - windowHalfX );
+				mouseY = ( event.clientY - windowHalfY );
+
+			}
+
+			function loop() {
+
+				camera.position.x += (mouseX - camera.position.x) * 0.05;
+				camera.position.y += (-mouseY - camera.position.y) * 0.05;
+
+				mesh.rotation.y -= 0.005;
+
+				renderer.render(scene, camera);
+				
+			}
+
+
+		</script>
+
+	</body>
+</html>

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác