Permalink
Cannot retrieve contributors at this time
Join GitHub today
GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.
Sign up
Find file
Copy path
bullet3/examples/pybullet/examples/pointCloudFromCameraImage.py
Find file
Copy path
Fetching contributors…

import pybullet as p | |
import math | |
import numpy as np | |
p.connect(p.GUI) | |
plane = p.loadURDF("plane100.urdf") | |
cube = p.loadURDF("cube.urdf", [0, 0, 1]) | |
def getRayFromTo(mouseX, mouseY): | |
width, height, viewMat, projMat, cameraUp, camForward, horizon, vertical, _, _, dist, camTarget = p.getDebugVisualizerCamera( | |
) | |
camPos = [ | |
camTarget[0] - dist * camForward[0], camTarget[1] - dist * camForward[1], | |
camTarget[2] - dist * camForward[2] | |
] | |
farPlane = 10000 | |
rayForward = [(camTarget[0] - camPos[0]), (camTarget[1] - camPos[1]), (camTarget[2] - camPos[2])] | |
lenFwd = math.sqrt(rayForward[0] * rayForward[0] + rayForward[1] * rayForward[1] + | |
rayForward[2] * rayForward[2]) | |
invLen = farPlane * 1. / lenFwd | |
rayForward = [invLen * rayForward[0], invLen * rayForward[1], invLen * rayForward[2]] | |
rayFrom = camPos | |
oneOverWidth = float(1) / float(width) | |
oneOverHeight = float(1) / float(height) | |
dHor = [horizon[0] * oneOverWidth, horizon[1] * oneOverWidth, horizon[2] * oneOverWidth] | |
dVer = [vertical[0] * oneOverHeight, vertical[1] * oneOverHeight, vertical[2] * oneOverHeight] | |
rayToCenter = [ | |
rayFrom[0] + rayForward[0], rayFrom[1] + rayForward[1], rayFrom[2] + rayForward[2] | |
] | |
ortho = [ | |
-0.5 * horizon[0] + 0.5 * vertical[0] + float(mouseX) * dHor[0] - float(mouseY) * dVer[0], | |
-0.5 * horizon[1] + 0.5 * vertical[1] + float(mouseX) * dHor[1] - float(mouseY) * dVer[1], | |
-0.5 * horizon[2] + 0.5 * vertical[2] + float(mouseX) * dHor[2] - float(mouseY) * dVer[2] | |
] | |
rayTo = [ | |
rayFrom[0] + rayForward[0] + ortho[0], rayFrom[1] + rayForward[1] + ortho[1], | |
rayFrom[2] + rayForward[2] + ortho[2] | |
] | |
lenOrtho = math.sqrt(ortho[0] * ortho[0] + ortho[1] * ortho[1] + ortho[2] * ortho[2]) | |
alpha = math.atan(lenOrtho / farPlane) | |
return rayFrom, rayTo, alpha | |
width, height, viewMat, projMat, cameraUp, camForward, horizon, vertical, _, _, dist, camTarget = p.getDebugVisualizerCamera( | |
) | |
camPos = [ | |
camTarget[0] - dist * camForward[0], camTarget[1] - dist * camForward[1], | |
camTarget[2] - dist * camForward[2] | |
] | |
farPlane = 10000 | |
rayForward = [(camTarget[0] - camPos[0]), (camTarget[1] - camPos[1]), (camTarget[2] - camPos[2])] | |
lenFwd = math.sqrt(rayForward[0] * rayForward[0] + rayForward[1] * rayForward[1] + | |
rayForward[2] * rayForward[2]) | |
oneOverWidth = float(1) / float(width) | |
oneOverHeight = float(1) / float(height) | |
dHor = [horizon[0] * oneOverWidth, horizon[1] * oneOverWidth, horizon[2] * oneOverWidth] | |
dVer = [vertical[0] * oneOverHeight, vertical[1] * oneOverHeight, vertical[2] * oneOverHeight] | |
lendHor = math.sqrt(dHor[0] * dHor[0] + dHor[1] * dHor[1] + dHor[2] * dHor[2]) | |
lendVer = math.sqrt(dVer[0] * dVer[0] + dVer[1] * dVer[1] + dVer[2] * dVer[2]) | |
cornersX = [0, width, width, 0] | |
cornersY = [0, 0, height, height] | |
corners3D = [] | |
imgW = int(width / 10) | |
imgH = int(height / 10) | |
img = p.getCameraImage(imgW, imgH, renderer=p.ER_BULLET_HARDWARE_OPENGL) | |
rgbBuffer = img[2] | |
depthBuffer = img[3] | |
print("rgbBuffer.shape=", rgbBuffer.shape) | |
print("depthBuffer.shape=", depthBuffer.shape) | |
#disable rendering temporary makes adding objects faster | |
p.configureDebugVisualizer(p.COV_ENABLE_RENDERING, 0) | |
p.configureDebugVisualizer(p.COV_ENABLE_GUI, 0) | |
p.configureDebugVisualizer(p.COV_ENABLE_TINY_RENDERER, 0) | |
visualShapeId = p.createVisualShape(shapeType=p.GEOM_SPHERE, rgbaColor=[1, 1, 1, 1], radius=0.03) | |
collisionShapeId = -1 #p.createCollisionShape(shapeType=p.GEOM_MESH, fileName="duck_vhacd.obj", collisionFramePosition=shift,meshScale=meshScale) | |
for i in range(4): | |
w = cornersX[i] | |
h = cornersY[i] | |
rayFrom, rayTo, _ = getRayFromTo(w, h) | |
rf = np.array(rayFrom) | |
rt = np.array(rayTo) | |
vec = rt - rf | |
l = np.sqrt(np.dot(vec, vec)) | |
newTo = (0.01 / l) * vec + rf | |
#print("len vec=",np.sqrt(np.dot(vec,vec))) | |
p.addUserDebugLine(rayFrom, newTo, [1, 0, 0]) | |
corners3D.append(newTo) | |
count = 0 | |
stepX = 5 | |
stepY = 5 | |
for w in range(0, imgW, stepX): | |
for h in range(0, imgH, stepY): | |
count += 1 | |
if ((count % 100) == 0): | |
print(count, "out of ", imgW * imgH / (stepX * stepY)) | |
rayFrom, rayTo, alpha = getRayFromTo(w * (width / imgW), h * (height / imgH)) | |
rf = np.array(rayFrom) | |
rt = np.array(rayTo) | |
vec = rt - rf | |
l = np.sqrt(np.dot(vec, vec)) | |
depthImg = float(depthBuffer[h, w]) | |
far = 1000. | |
near = 0.01 | |
depth = far * near / (far - (far - near) * depthImg) | |
depth /= math.cos(alpha) | |
newTo = (depth / l) * vec + rf | |
p.addUserDebugLine(rayFrom, newTo, [1, 0, 0]) | |
mb = p.createMultiBody(baseMass=0, | |
baseCollisionShapeIndex=collisionShapeId, | |
baseVisualShapeIndex=visualShapeId, | |
basePosition=newTo, | |
useMaximalCoordinates=True) | |
color = rgbBuffer[h, w] | |
color = [color[0] / 255., color[1] / 255., color[2] / 255., 1] | |
p.changeVisualShape(mb, -1, rgbaColor=color) | |
p.addUserDebugLine(corners3D[0], corners3D[1], [1, 0, 0]) | |
p.addUserDebugLine(corners3D[1], corners3D[2], [1, 0, 0]) | |
p.addUserDebugLine(corners3D[2], corners3D[3], [1, 0, 0]) | |
p.addUserDebugLine(corners3D[3], corners3D[0], [1, 0, 0]) | |
p.configureDebugVisualizer(p.COV_ENABLE_RENDERING, 1) | |
print("ready\n") | |
#p.removeBody(plane) | |
#p.removeBody(cube) | |
while (1): | |
p.setGravity(0, 0, -10) |