Pybullet公式gitリポジトリのサンプルコードを解説するシリーズです(一覧はこちら)。
今回は、projective_texture.pyを解説します。(コードのリンクはこちら)
(コメントアウトを外し)本コードを実行すると、指定したオブジェクトにテクスチャを適用可能です。
使用している機能
本コードは、以下の機能を使用して「テクスチャの読み込み」「テクスチャの適用」を実現しています。
テクスチャの読み込み
loadTexture
関数を使用することで、テクスチャを読み込むことが可能です。
textureId = pybullet.loadTexture(textureFile)
-
textureId
:テクスチャのID -
textureFile
:テクスチャのファイル(今回の場合、jpgファイルを読み込み)
テクスチャの適用
changeVisualShape
関数を使用することで、オブジェクトにテクスチャを指定することができます。
pybullet.changeVisualShape(objectUniqueId, linkIndex, textureUniqueId)
-
objectUniqueId
:テクスチャを適用するオブジェクトのID -
linkIndex
:オブジェクトのリンクのインデックス(ベースリンクの場合、-1) -
textureUniqueId
:テクスチャのID
今回のサンプルコードの場合、該当箇所がコメントアウトされているため、実行したい場合はコメントを外してください。
# 指定したオブジェクトにテクスチャを適用
#p.changeVisualShape(objectUniqueId=0, linkIndex=-1, textureUniqueId=textureId)
#p.changeVisualShape(objectUniqueId=1, linkIndex=-1, textureUniqueId=textureId)
コメントをつけたサンプルコード
サンプルコードにコメントをつけたものが以下になります(もともとあった不要と思われるコメント等については削除しています)
import pybullet as p
from time import sleep
import matplotlib.pyplot as plt
import numpy as np
import pybullet_data
# GUIモードでPybulletを接続
physicsClient = p.connect(p.GUI)
# Pybulletに関するデータパスを取得
p.setAdditionalSearchPath(pybullet_data.getDataPath())
# 重力を[0,0,0]に設定
p.setGravity(0, 0, 0)
# 床のオブジェクトの位置/姿勢を設定(なぜかbearと記載されている)
bearStartPos1 = [-3.3, 0, 0]
bearStartOrientation1 = p.getQuaternionFromEuler([0, 0, 0])
# 床のオブジェクトを生成
bearId1 = p.loadURDF("plane.urdf", bearStartPos1, bearStartOrientation1)
# クマのオブジェクトの位置/姿勢を設定
bearStartPos2 = [0, 0, 0]
bearStartOrientation2 = p.getQuaternionFromEuler([0, 0, 0])
# クマのオブジェクトを生成
bearId2 = p.loadURDF("teddy_large.urdf", bearStartPos2, bearStartOrientation2)
# テクスチャを読み込み
textureId = p.loadTexture("checker_grid.jpg")
# 指定したオブジェクトにテクスチャを適用
#p.changeVisualShape(objectUniqueId=0, linkIndex=-1, textureUniqueId=textureId)
#p.changeVisualShape(objectUniqueId=1, linkIndex=-1, textureUniqueId=textureId)
# リアルタイムシミュレーションモードに設定
useRealTimeSimulation = 1
if (useRealTimeSimulation):
p.setRealTimeSimulation(1)
while 1:
if (useRealTimeSimulation):
# カメラデータを取得
camera = p.getDebugVisualizerCamera()
viewMat = camera[2]
projMat = camera[3]
# カメラ画像を取得
p.getCameraImage(300,
300,
renderer=p.ER_BULLET_HARDWARE_OPENGL,
flags=p.ER_USE_PROJECTIVE_TEXTURE,
projectiveTextureView=viewMat,
projectiveTextureProj=projMat)
# 重力を[0,0,0]に設定
p.setGravity(0, 0, 0)
else:
p.stepSimulation()