Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

blenderで視覚的にオブジェクトが重なっている場合、隠れている箇所を赤色で表示したい

blenderで作成した2つのオブジェクトが視覚的に重なる状況にあり、その隠れている箇所を赤色で表示するという処理をpythonで実現したい。(最終的にはglb出力をし、htmlでオブジェクトを回転させたい)

具体的にはカメラを視点として、ObstacleObject(障害物)に隠れているHiddenObject(隠れているオブジェクト)の重なって見える箇所を赤色で表示し、HiddenObject(隠れているオブジェクト)の重なっていない箇所は通常マテリアルで表示したい。

二枚の画像を添付しました。それぞれ実装予想図(カメラ視点)と、横から見た距離関係です。
実装予想図ではペイントソフトで、隠れている箇所を赤色で描いています

プログラミング初心者のためどのようにコードを実装をすれば実現できるのか検討もつきません
お力添えいただけますと幸いです。よろしくお願い致します

実装予想図.jpg
横から見た距離関係.jpg

0 likes

1Answer

まずはその2つのオブジェクトをカメラ視点で表示するサンプルを作成して下さい

開発環境と使用したライブラリとサンプルが提示されれば隠れている箇所を示すオブジェクトの制作方法の回答が得られると思います

2つのオブジェクトをカメラ視点で表示する方法がわからない場合は別途質問して下さい

0Like

Comments

  1. @rakkonoashi

    Questioner

    Blender内のスクリプト作成画面からPythonで作成しています。
    ・Blenderバージョン :4.4.0
    ・Pythonバージョン :3.11.11
    ・使用したライブラリ:
     -sys
     -bpy
     -math
     -mathutils

    ObstacleObject(障害物)とHiddenObject(隠れているオブジェクト)が重なる位置にカメラを手動で配置している。
    カメラがObstacleObject(障害物)の方向を向くようにカメラを回転させ、カメラ視点で表示するサンプルを作成した。以下に全文を記述する。
    足りない情報があれば教えていただけると助かります。

    カメラ回転・カメラ視点で表示するサンプル
    import sys
    import bpy
    import math
    from mathutils import Vector, Matrix
    
    scene = bpy.context.scene
    camera = scene.camera
    camera_data = camera.data
    
    camera_angle = camera_data.angle
    print(camera_angle)
    
    # ObstacleObject をターゲットに
    target_obj = bpy.data.objects.get("ObstacleObject")
    target_location = target_obj.location
    
    # カメラをターゲットに向ける
    def camera_look_at(camera_obj, target_location):
        direction = target_location - camera_obj.location
        rot_quat = direction.to_track_quat('-Z', 'Y')
        camera_obj.rotation_euler = rot_quat.to_euler()
    
    camera_look_at(camera, target_location)
    
    # 回転直後の行列更新
    camera.update_tag(refresh={'DATA'})
    bpy.context.view_layer.update()
    
    # ターゲットをカメラ視点に変換
    loc = camera.matrix_world.inverted() @ target_location
    print(loc)
    
    x_tan = loc[0] / loc[2]
    y_tan = loc[1] / loc[2]
    angle_tan = math.tan(camera_angle / 2)
    print(angle_tan)
    
    camera_data.shift_x = -x_tan / (2 * angle_tan)
    camera_data.shift_y = -y_tan / (2 * angle_tan)
    
    # カメラビューに切り替える
    def toggle_camera_view():
        for window in bpy.context.window_manager.windows:
            for area in window.screen.areas:
                if area.type == 'VIEW_3D':
                    for region in area.regions:
                        if region.type == 'WINDOW':
                            with bpy.context.temp_override(window=window, area=area, region=region):
                                if bpy.ops.view3d.view_camera.poll():
                                    bpy.ops.view3d.view_camera()
                                    return True
        return False
    
    toggle_camera_view()
    

Your answer might help someone💌