我将Cinema4D中的动画关键帧(使用超棒的py4D)存储到列表列表中:
props = [lx,ly,lz,sx,sy,sz,rx,ry,rz]
Run Code Online (Sandbox Code Playgroud)
我在任意动画中打印出每个属性/轨道的关键帧,它们的长度不同:
track Position . X has 24 keys
track Position . Y has 24 keys
track Position . Z has 24 keys
track Scale . X has 1 keys
track Scale . Y has 1 keys
track Scale . Z has 1 keys
track Rotation . H has 23 keys
track Rotation . P has 24 keys
track Rotation . B has 24 keys
Run Code Online (Sandbox Code Playgroud)
现在,如果我想在Blender中使用这些键,我需要做类似的事情:
到目前为止,我的计划是:
这是最好的方法吗?
这是问题的背景.
首先,我需要找到最大的道具商店列表.我是python的新手,想知道是否有一个神奇的功能可以帮助你.与max()类似,但是对于列表长度.
目前我正在考虑像这样编码:
//after …Run Code Online (Sandbox Code Playgroud) 我想让我的初始化脚本创建交互式Blender应用程序(不一定是游戏)所需的其他传感器/控制器/执行器.这有两个原因:
实际上,创建模板文件部分解决了第一个问题.但是我不能为不同的项目混合搭配不同的部分,或者我必须为每种可能性创建一个模板.
我搜索了游戏引擎文档和Python API,但找不到任何线索.__init__逻辑砖的方法甚至没有列在那里.
但如果有任何方法可以在Python中动态创建逻辑块,我想尝试一下.
注意:由于我对BGE的了解有限,您不能直接从Python访问按键.需要传感器.
我正在写一个来自Blender 2.64的python导出脚本.我的想法是我试图以OpenGL VBO友好的方式导出网格数据.所以我在结构布局数组中导出顶点属性.例如,对于具有顶点,法线和1对纹理坐标的网格,vertexAttributeVBO中的每个都将是8个连续的浮点数:
vvvnnntt
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.问题是,当Blender进行UV映射时,它实际上可以将不同的uv分配给同一个顶点.
也就是说,假设你有一个立方体:你有8个顶点,你有6个面(在这种情况下为四边形).我原以为指数0,1,2,3的面/多边形意味着:
vertex 0, normal 0, uvCoord0
vertex 1, normal 1, uvCoord1
vertex 2, normal 2, uvCoord2
vertex 3, normal 3, uvCoord3
Run Code Online (Sandbox Code Playgroud)
因此,任何提及索引0,例如,在任何面上,总是意味着顶点0,正常0,uvCoord0元组.好吧,在Blender中,如果我理解正确,一个面可以用uvCoord 0引用顶点0,而另一个面可能用不同的uVCoord引用相同的顶点0.因此,一个face的loop_indices实际上必须用于在objets general data.vertices和data.uv_layers[].data容器中查找向量和uvCoord .
这允许每面应用uv贴图.所以你可以有一个立方体,其中每个面都应用了不同的uv纹理,即使两个相邻的面共享一个顶点,顶点也有不同的uv坐标,具体取决于面.
尽管如此,我的网格对于同一个顶点不应该有不同的uv,因为我正在展开相邻的面.这意味着在我的UV地图中,展开的网格是一组相邻的面(例如,如果它是由6个面构成的立方体,则为十字形),在两个相邻面之间,它们的公共顶点应该对应于相同的点在紫外线地图中.
所以鉴于上述情况,我认为这种方法应该有效:
vertexAttributeList = []
for vertex in mesh.data.vertices:
vertexAttribute = list(vertex.co)
vertexAttribute.extend(list(vertex.normal))
vertexAttributeList.append(vertexAttribute)
for triangle in mesh.data.polygons:
for uv_layer in mesh.data.uv_layers:
for i in triangle.loop_indices:
lookupIndex = mesh.data.loops[i].vertex_index
if len(vertexAttributeList[lookupIndex]) == 6:
uvCoord = uv_layer.data[i].uv
vertexAttributeList[lookupIndex].extend([uvCoord[0], 1 - uvCoord[1]])
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,上面代码中的含义是我将不止一次访问顶点,因为我正在迭代共享顶点的网格面(本例中为三角形).每次我访问一个顶点时,如果它还没有分配它的UV坐标,那么我通过使用三角形的loop_indices查找它们来分配它们.毕竟,我的假设是,在一天结束时,每个顶点都有独特的uv coords.
上面的代码给出了以下布局,例如(我正在显示网格的前6个顶点属性): …
好吧,我对Blender完全不熟悉,我只是在寻找一些关于如何使用python来控制它的好教程.我希望能够通过python方法添加/删除/编辑光源......这可以吗?谢谢你的建议.
我通过动画将模型从Blender输出到Collada.众所周知,Blender是一个右手系统,所以它的上轴是z,而OpenGL ES2是Y-Up.
对于静态网格物体,我可以围绕x轴旋转对象90度,但是当我将旋转应用于帧的矩阵时,它会产生意外结果.
那我该怎么做呢?
我在blender中有一个python脚本
subprocess.call(os.path.abspath('D:/Test/run-my-script.sh'),shell=True)
接着是许多其他代码,依赖于这个shell脚本来完成.会发生什么事情,它不等待它完成,我不知道为什么?我甚至试过使用Popen 而不是call如图所示:
p1 = subprocess.Popen(os.path.abspath('D:/Test/run-my-script.sh'),shell=True)
p1.wait()
Run Code Online (Sandbox Code Playgroud)
我尝试使用commuincate但它仍然无法正常工作:
p1 = subprocess.Popen(os.path.abspath('D:/Test/run-my-script.sh'),shell=True).communicate()
Run Code Online (Sandbox Code Playgroud)
这个shell脚本在MacOS上运行得很好(在更改路径后)并在使用时等待 subprocess.call(['sh', '/userA/Test/run-my-script.sh'])
但是在Windows上发生了这种情况,我在Blender中运行下面的python脚本然后一旦它到达子进程行Git bash打开并运行shell脚本,而blender不等待它完成它只是Hello在其控制台中打印而无需等待Git Bash完成.有帮助吗?
import bpy
import subprocess
subprocess.call(os.path.abspath('D:/Test/run-my-script.sh'),shell=True)
print('Hello')
Run Code Online (Sandbox Code Playgroud) 好的,在观看教程时,我愚蠢地错过了必须在对象模式下添加形状以创建新对象的部分.那么我现在在一个对象中有5个形状,并且不能以不同的方式着色它们.如果我不是那么远,我会重新创建它们,但如果有人知道如何将它们提取到新对象或分解我拥有的单个对象,我将非常感激.
从UV Sphere创建的对象,并在该对象内添加了3个其他UV球体和一个圆柱体.
我正在使用Blender 2.5,如果这很重要的话.
在等待答案的同时,我找到了另一种方法来使它们成为不同的对象.我进入了对象模式,其他4次复制了我的对象,并删除了每个复制中除了一个形状之外的所有形状...允许我为每个对象创建一个形状.
注意:如果他们能够真正告诉我是否有办法将一个对象分成多个,我仍会给予任何人一定的回答.
动机
我正在尝试使用WebGL创建一个小型演示应用程序.我选择使用SceneJS,因为它似乎是一个简单的框架,并且足以满足此目的.
我已经下载了几个.blend模型(Amy Rose等)并使用Blender将它们导出为Collada(.dae)文件.然后我使用scenejs-pycollada将它们转换为json模型.
我只花了几个小时让scenejs-pycollada转换器工作.如果您以前从未使用过Python,那么显然让这些Python依赖项在Windows中运行并不容易.;)
问题
但现在我被困(再次).我的问题是模型没有任何纹理或材料.
我使用了SceneJS 的Seymour Plane示例.我转换的模型几乎看不到.它是黑色的,似乎不响应场景中的灯光.如果我将平面和模型加载在一起,我可以看到模型被加载,因为它的手臂和腿伸出了飞机.
现在我按照了几个教程,让我将纹理导出为PNG图像.然后我修改了JSON模型中的纹理文件名以匹配文件名,但它没有帮助.
所以我希望有人可以帮我找到一种方法将Blender模型(或其他常见的3D模型)导出为SceneJS使用的JSON格式,包括纹理.
只要它工作,在SceneJS中加载模型的任何其他方法也会这样做.
如果有一个免费下载身体/图形JSON模型的链接,这将有助于现在,但我宁愿了解它是如何工作的.:)
我正在使用
我的工作流程
在Blender中,我将模型导出到Collada(*.dae)文件,然后使用scenejs-pycollada将它们转换为Raw JSON.这给了我一个JSON文件,里面有两个对象.第一个似乎是场景,第二个是模型.我保留第二个并将其放在SceneJS示例代码中使用的Javascript变量中.该模型以, "type": "library", "parent": "Scene"我需要从代码中删除的属性结束,以使其加载.
我想在Blender本身中使用脚本模式读出Blender对象的自定义属性.到目前为止,我发现只能读出您在脚本模式下自己创建的自定义属性.但是我想读出我自己用手标记的自定义属性.这意味着我没有要使用的局部变量.
我希望它在以下上下文中:我有一个循环遍历所有对象:
for obj in bpy.data.objects:
if not 'Camera' in obj.name and not 'Lamp' in obj.name and not 'Armature' in obj.name:
#here I get the location of the current Object
loc.append(obj.location)
Run Code Online (Sandbox Code Playgroud)
现在什么是完美的,将是这样的:
obj.getCustomProperties
Run Code Online (Sandbox Code Playgroud)
有没有办法用Blender Python模式做到这一点?
谢谢,丹尼尔
blender ×10
python ×6
3d ×1
blender-2.61 ×1
cinema-4d ×1
collada ×1
game-engine ×1
git-bash ×1
interactive ×1
json ×1
light ×1
list ×1
opengl-es ×1
rendering ×1
scenejs ×1
shell ×1
subprocess ×1
textures ×1