Shade3D 公式

頂点の座標修正に関する件


#1

頂点カラーに関する件 を参考にして

赤いところがポコッと膨らむスクリプトを作成したのてずすが、全然違う場所が膨らんでしまいました。
アドバイスのほどお願いします。

xshade.scene().clear()
xshade.scene().create_primitive_box(None, 3, True, 10, 10, 1, [1000, 0, 0], [1000, 0, 1000], [0, 0, 1000], [0, 0, 0], [0, 200, 0], True, True)
xshade.scene().move_object([500, 100, 500], None, [0, 0, 180], None)
xshade.scene().active_shape().has_surface_attributes = 1
xshade.scene().active_shape().surface.mapping_layer(0).pattern = 15
shape = xshade.scene().active_shape()
shape.append_vertex_color_layer()
print shape.number_of_faces
f=65
v=0
face = shape.face(f)
face.set_vertex_color(0, v, [1.0, 0, 0, 1.0])
zahyo=face.vertex(0).position
zahyo=(zahyo[0],zahyo[1]+100,zahyo[2])
face.vertex(v).position=zahyo

#2

v=0になっていますので、頂点番号0が膨らんでいます。
面番号65を構成する頂点番号を指定する必要があります。


#3

face クラスの vertex は実装の問題により意図しない値が返ります。
shape.face(65).vertex(0) は、面番号 65 の面の最初の頂点を取得されることが期待されますが、
実際は、ポリゴンメッシュの頂点番号 0 の頂点の shape.vertex(0) と同じ値が取得されてしまいます。

face の vertex は廃止予定のため、shape の vertex に面を構成する頂点番号を指定して取得してください。
面を構成する頂点番号は、face クラスの vertex_indices で取得できます。

例えば、面番号 65 の最初の頂点座標は以下のように取得します。

f = 65
v = 0 
face = shape.face(f)
zahyo=shape.vertex(face.vertex_indices[v]).position

#4

ご回答ありがとうございます。
適当な式入れて遊んでいたらカーテン見たいなものができました。

# coding: 'shift_jisx0213'
import random
import math

def lesson1():
    scene = xshade.scene()
    shape = scene.active_shape()
	# 頂点カラーはポジゴンメッシュのみ.
    if shape.type != 7:
        print 'ポリゴンメッシュを選択してください'
        return False
	# 頂点カラーレイヤーがない場合は作成する.
    if shape.number_of_vertex_color_layers == 0:
        shape.append_vertex_color_layer()
    gy=0
    ii=0
	# 頂点カラーは面ごとに指定する.
    for i in range(shape.number_of_faces/2):
        if i>2499:
            return True
        face = shape.face(i)
        for j in range(1):
            r=0.5
            g=math.fabs(math.sin((ii+i)/100.0))
            b=0
            if i%50==0:
                ii=ii+10
            else: 
                ii=0
            y=math.fabs(math.sin((ii+i)/100.0))
            zahyo=shape.vertex(face.vertex_indices[j]).position
            zahyo=(zahyo[0],zahyo[1]-y,zahyo[2])
            shape.vertex(face.vertex_indices[j]).position=zahyo
            face.set_vertex_color(0, j, [r, g, b, 1.0])
    return True

xshade.scene().clear()
xshade.scene().create_primitive_box(None, 3, True, 50, 50, 1, [-165, -100, -20], [-165, -100, -10], [-175, -100, -10], [-175, -100, -20], [0, -1.5, 0], True, True)
xshade.scene().active_shape().has_surface_attributes = 1
xshade.scene().active_shape().surface.mapping_layer(0).pattern = 15
lesson1()

色が違いますが、試しに部屋にかけてみました。