0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

【Pybulletサンプル解説】オブジェクトのテクスチャを動的に変更する【changeTexture.py】

Posted at

お疲れ様です。秋並です。

Pybullet公式gitリポジトリのサンプルコードを解説するシリーズです(一覧はこちら)。


今回は、changeTexture.pyを解説します。(コードのリンクはこちら

本コードを実行すると、テクスチャがリアルタイムで更新される様子を確認できます。

changeTexture.gif

使用している機能

本コードは、以下の機能を使用して「テクスチャの変更」を実現しています。

  • テクスチャの変更

テクスチャの変更

pybulletでは、changeTexture関数を使用することで「テクスチャの変更」をすることができます。

pybullet.changeTexture(texUid, pixels, width, height)
  • texUid:テクスチャのID
  • pixels:テクスチャのピクセルデータを格納したリスト
    • リストの長さはwidth * height * 3
  • width:テクスチャの幅
  • height:テクスチャの高さ

サンプルコードでは、1ステップごとに半透明な床のテクスチャを変更することで、半透明な床が動いているような動きをシミュレーションしています。

コメントをつけたサンプルコード

サンプルコードにコメントをつけたものが以下になります(もともとあった不要と思われるコメント等については削除しています)

import pybullet as p
import time
import pybullet_data

# PybulletをGUIモードで接続
p.connect(p.GUI)

# Pybulletに関するデータのパスを取得
p.setAdditionalSearchPath(pybullet_data.getDataPath())

# 床を異なる位置に生成
planeUidA = p.loadURDF("plane_transparent.urdf", [0, 0, 0])
planeUid = p.loadURDF("plane_transparent.urdf", [0, 0, -1])

# テクスチャをロード
texUid = p.loadTexture("tex256.png")

# 床を半透明に設定
p.changeVisualShape(planeUidA, -1, rgbaColor=[1, 1, 1, 0.5])
p.changeVisualShape(planeUid, -1, rgbaColor=[1, 1, 1, 0.5])

# 片方の床にテクスチャを適用
p.changeVisualShape(planeUid, -1, textureUniqueId=texUid)

# 床のサイズを定義
width = 256
height = 256

# 床の各ピクセルにおける色を白色で初期化
pixels = [255] * width * height * 3
colorR = 0
colorG = 0
colorB = 0

blue = 0

# ログの記録を開始
logId = p.startStateLogging(p.STATE_LOGGING_PROFILE_TIMINGS, "renderbench.json")

# 100000回のループを開始し、各ステップでピクセルの値を更新し、テクスチャに反映
for i in range(100000):

  # シミュレーションを1ステップ進める
  p.stepSimulation()
  for i in range(width):
    for j in range(height):
    
      # 各ピクセル(RGB)を設定
      pixels[(i + j * width) * 3 + 0] = i # RGBのR(赤色)を設定
      pixels[(i + j * width) * 3 + 1] = (j + blue) % 256 # RGBのG(緑色)を設定
      pixels[(i + j * width) * 3 + 2] = blue # RGBのB(青色)を設定
      
  blue = blue + 1

  # テクスチャを変更
  p.changeTexture(texUid, pixels, width, height)

  # レンダリング時間を計測(計測開始)
  start = time.time()

  # カメラから画像を取得
  p.getCameraImage(300, 300, renderer=p.ER_BULLET_HARDWARE_OPENGL)

  # レンダリング時間を計測(計測終了)
  end = time.time()

  # レンダリング時間を表示
  print("rendering duration")
  print(end - start)

# ログの記録を停止
p.stopStateLogging(logId)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?