お疲れ様です。秋並です。
Pybullet公式gitリポジトリのサンプルコードを解説するシリーズです(一覧はこちら)。
今回は、changeTexture.pyを解説します。(コードのリンクはこちら)
本コードを実行すると、テクスチャがリアルタイムで更新される様子を確認できます。
使用している機能
本コードは、以下の機能を使用して「テクスチャの変更」を実現しています。
- テクスチャの変更
テクスチャの変更
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)