pythreejs: как визуализировать обрезанные поверхности как сплошные объекты - PullRequest
0 голосов
/ 19 апреля 2019

Я хотел бы добиться того, что описано в https://stackoverflow.com/a/37093210 с pythreejs в JupyterLab вместо чистого javascript.

Могу ли я как-то создать подкласс MeshPhongMaterial в python, чтобы добавить это изменение?

Я также счастлив пойти по маршруту ShaderMaterial (см. https://github.com/jupyter-widgets/pythreejs/blob/master/examples/Shaders.ipynb), если бы я понял, как использовать vertexShader и fragmentShader, так что это примерно похоже на MeshStandarMaterial или MeshPhongMaterial (Мне нужны окружающие и точечные источники света и DoubleSide поддержка освещения).

Конечно, любая другая идея, которая подводит меня к тому, что изображено в https://stackoverflow.com/a/37093210 с pythreejs, приветствуется.

1 Ответ

0 голосов
/ 20 апреля 2019

Было удивительно легко портировать SectionHelper, упомянутый в ответе https://stackoverflow.com/a/38186639

class SectionHelper(Mesh):
    def __init__(self, object, hexOrMaterial):
        if isinstance(hexOrMaterial, MeshBasicMaterial):
            material = hexOrMaterial
        else:
            color = hexOrMaterial
            material = MeshBasicMaterial(color=color, side="BackSide")

        super().__init__(object.geometry, material)

        self.matrix = object.matrixWorld
        self.matrixAutoUpdate = False

Результат, как и ожидалось,

from ipywidgets import Layout
material = MeshPhongMaterial(color = "green", side="DoubleSide", diffuse="red")

torus = Mesh(
    TorusKnotBufferGeometry(radius=20, tube=5, tubularSegments=64, radialSegments=64, p=2, q=3), 
    material=material
)

sec = SectionHelper(torus, "#ff00ff")

key_light = DirectionalLight(color='white', position=[3, 5, 1], intensity=0.5)

c = PerspectiveCamera(position=[0, 100, 100], up=[0, 1, 0], children=[key_light])

scene = Scene(children=[torus, sec, c, AmbientLight(color='#777777')], background=None)

renderer = Renderer(camera=c, 
                    scene=scene,
                    alpha=True,
                    clearOpacity=0,
                    controls=[OrbitControls(controlling=c)],
                    width=500, height=500)

renderer.localClippingEnabled = True;
display(renderer)

for i in range(-64, 64):
    renderer.clippingPlanes = [Plane((0,-1,0), i/2.0)]
    time.sleep(0.1)

обрезанный torusknot

...