1

我有以下脚本:

import bpy
import os

print("Starter")

selection = bpy.context.selected_objects

for obj in selection:

    print("Obj selected")

    me = obj.data

    for edge in me.edges:

        vert1 = me.vertices[edge.vertices[0]]
       vert2 = me.vertices[edge.vertices[1]]
       print("<boundingLine p1=\"{0}f,0.0f,{1}f,1.0f\" p2=\"{2}f,0.0f,{3}f,1.0f\" />".format(vert1.co.x, vert1.co.y, vert2.co.x, vert2.co.y))       

很基本,对吧?它只是将所有边缘打印到控制台中,让我将粘贴复制到 xml 文档中。当我缩放对象并在对象上执行此脚本时,我会在缩放之前获得输出到控制台的对象的 OLD 未缩放值。我尝试在所有轴上移动对象中的每个顶点,这导致输出的值被放大,然后根据我的移动进行转换。

如果我按 n 检查顶点全局值,它们会正确缩放。

为什么我没有得到正确的值?!?

这个脚本应该可以节省时间,但是让任何东西在搅拌机中工作都是一件苦差事!他们刚刚更新了他们的 api 并没有帮助,所以那里的所有示例代码都已经过时了!

4

3 回答 3

2

好吧,这就是交易:当您在 Blender 中缩放、平移或旋转对象时,或者以其他方式执行转换时,该转换会以某种方式“存储”。你需要做什么我选择你应用了变换的对象,并使用快捷键CTRL + A,然后应用你的变换。

...

因此,通过 blender api 访问的内部数据与实际显示的值之间不乏偶然性(我使用这个词对吗?检查了它的定义,看起来是对的)。

我确信这个设计是有道理的,但现在我想一拳打在想出它的人的喉咙上。如果我缩放某些东西,我打算缩放被缩放的东西!

但无论如何,我得到奇怪值的原因是因为没有应用缩放,一旦你在对象模式下选择了你缩放的对象,你就用 CTRL + A 来做。

于 2012-10-01T07:46:51.010 回答
0

网格对象的顶点具有内部坐标系,以及适用于整个对象的全局平移、缩放和旋转变换。您可以将全局缩放矩阵应用于网格数据,并将顶点坐标转换为全局坐标系,如下所示:

bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.transform_apply(scale=True)
bpy.ops.object.select_all(action='DESELECT')

transform_apply()允许应用旋转和平移矩阵的其他选项。

于 2015-02-09T22:59:30.423 回答
0

我不是真正的 Blender 用户(而是 Maya 用户),我认为您可以尝试一些不同的东西(我也会说更慢......),只需遍历选定的顶点,创建一个定位器或一个空对象并对其进行约束到顶点位置并获取它的 x,y,z 坐标。我已经在maya中完成了它并且可以工作。

让我们这样说:

data_list = []

selection = #selection code here#

for v in selection:

    loc = locator()
    pointconstraint(v, loc)
    data_list.append(loc.translation_attributes)
于 2012-09-30T21:58:37.057 回答