From b880ddf76bd45f78f43517a139b99e6908074a37 Mon Sep 17 00:00:00 2001 From: Erwin Coumans Date: Mon, 8 Aug 2016 14:23:44 -0700 Subject: [PATCH] add pybullet render API with yaw/pitch/roll option add testrender.py file allow option to enable OpenGL hardware renderer in multithreaded sim b3RequestCameraImageSelectRenderer(commandHandle,ER_BULLET_HARDWARE_OPENGL); --- build_and_run_cmake.sh | 2 +- .../ExampleBrowser/OpenGLExampleBrowser.cpp | 2 +- examples/RoboticsLearning/b3RobotSimAPI.cpp | 64 ++++++++++-- examples/SharedMemory/PhysicsClientC_API.cpp | 99 ++++++++++++------- examples/SharedMemory/PhysicsClientC_API.h | 2 +- .../SharedMemory/PhysicsClientExample.cpp | 12 +-- .../PhysicsClientSharedMemory.cpp | 2 +- examples/SharedMemory/PhysicsDirect.cpp | 4 +- .../SharedMemory/PhysicsServerExample.cpp | 55 ++++++++++- examples/pybullet/pybullet.c | 12 ++- examples/pybullet/testrender.py | 46 +++++---- 11 files changed, 219 insertions(+), 81 deletions(-) diff --git a/build_and_run_cmake.sh b/build_and_run_cmake.sh index 28354357b..13cb76c62 100755 --- a/build_and_run_cmake.sh +++ b/build_and_run_cmake.sh @@ -2,6 +2,6 @@ rm CMakeCache.txt mkdir build_cmake cd build_cmake -cmake -DBUILD_PYTHON=OFF -CMAKE_BUILD_TYPE=Release .. +cmake -DBUILD_PYBULLET=OFF -DCMAKE_BUILD_TYPE=Release .. make -j12 examples/ExampleBrowser/App_ExampleBrowser diff --git a/examples/ExampleBrowser/OpenGLExampleBrowser.cpp b/examples/ExampleBrowser/OpenGLExampleBrowser.cpp index d0fae2254..d6fab65a3 100644 --- a/examples/ExampleBrowser/OpenGLExampleBrowser.cpp +++ b/examples/ExampleBrowser/OpenGLExampleBrowser.cpp @@ -520,7 +520,7 @@ void MyStatusBarError(const char* msg) gui2->textOutput(msg); gui2->forceUpdateScrollBars(); } - btAssert(0); + btAssert(0); } diff --git a/examples/RoboticsLearning/b3RobotSimAPI.cpp b/examples/RoboticsLearning/b3RobotSimAPI.cpp index ce9f032b7..38914873e 100644 --- a/examples/RoboticsLearning/b3RobotSimAPI.cpp +++ b/examples/RoboticsLearning/b3RobotSimAPI.cpp @@ -47,6 +47,7 @@ enum MultiThreadedGUIHelperCommunicationEnums eRobotSimGUIHelperCreateCollisionShapeGraphicsObject, eRobotSimGUIHelperCreateCollisionObjectGraphicsObject, eRobotSimGUIHelperRemoveAllGraphicsInstances, + eRobotSimGUIHelperCopyCameraImageData, }; #include @@ -152,7 +153,7 @@ void* RobotlsMemoryFunc() -ATTRIBUTE_ALIGNED16(class) MultiThreadedOpenGLGuiHelper : public GUIHelperInterface +ATTRIBUTE_ALIGNED16(class) MultiThreadedOpenGLGuiHelper2 : public GUIHelperInterface { CommonGraphicsApp* m_app; @@ -185,7 +186,7 @@ public: int m_instanceId; - MultiThreadedOpenGLGuiHelper(CommonGraphicsApp* app, GUIHelperInterface* guiHelper) + MultiThreadedOpenGLGuiHelper2(CommonGraphicsApp* app, GUIHelperInterface* guiHelper) :m_app(app) ,m_cs(0), m_texels(0), @@ -195,7 +196,7 @@ public: } - virtual ~MultiThreadedOpenGLGuiHelper() + virtual ~MultiThreadedOpenGLGuiHelper2() { delete m_childGuiHelper; } @@ -345,10 +346,39 @@ public: { } + float m_viewMatrix[16]; + float m_projectionMatrix[16]; + unsigned char* m_pixelsRGBA; + int m_rgbaBufferSizeInPixels; + float* m_depthBuffer; + int m_depthBufferSizeInPixels; + int m_startPixelIndex; + int m_destinationWidth; + int m_destinationHeight; + int* m_numPixelsCopied; + virtual void copyCameraImageData(const float viewMatrix[16], const float projectionMatrix[16], unsigned char* pixelsRGBA, int rgbaBufferSizeInPixels, float* depthBuffer, int depthBufferSizeInPixels, int startPixelIndex, int destinationWidth, int destinationHeight, int* numPixelsCopied) { - if (numPixelsCopied) - *numPixelsCopied = 0; + m_cs->lock(); + for (int i=0;i<16;i++) + { + m_viewMatrix[i] = viewMatrix[i]; + m_projectionMatrix[i] = projectionMatrix[i]; + } + m_pixelsRGBA = pixelsRGBA; + m_rgbaBufferSizeInPixels = rgbaBufferSizeInPixels; + m_depthBuffer = depthBuffer; + m_depthBufferSizeInPixels = depthBufferSizeInPixels; + m_startPixelIndex = startPixelIndex; + m_destinationWidth = destinationWidth; + m_destinationHeight = destinationHeight; + m_numPixelsCopied = numPixelsCopied; + + m_cs->setSharedParam(1,eRobotSimGUIHelperCopyCameraImageData); + m_cs->unlock(); + while (m_cs->getSharedParam(1)!=eRobotSimGUIHelperIdle) + { + } } virtual void autogenerateGraphicsObjects(btDiscreteDynamicsWorld* rbWorld) @@ -375,7 +405,7 @@ struct b3RobotSimAPI_InternalData b3ThreadSupportInterface* m_threadSupport; RobotSimArgs m_args[MAX_ROBOT_NUM_THREADS]; - MultiThreadedOpenGLGuiHelper* m_multiThreadedHelper; + MultiThreadedOpenGLGuiHelper2* m_multiThreadedHelper; bool m_connected; @@ -494,6 +524,24 @@ void b3RobotSimAPI::processMultiThreadedGraphicsRequests() m_data->m_multiThreadedHelper->getCriticalSection()->unlock(); break; } + case eRobotSimGUIHelperCopyCameraImageData: + { + m_data->m_multiThreadedHelper->m_childGuiHelper->copyCameraImageData(m_data->m_multiThreadedHelper->m_viewMatrix, + m_data->m_multiThreadedHelper->m_projectionMatrix, + m_data->m_multiThreadedHelper->m_pixelsRGBA, + m_data->m_multiThreadedHelper->m_rgbaBufferSizeInPixels, + m_data->m_multiThreadedHelper->m_depthBuffer, + m_data->m_multiThreadedHelper->m_depthBufferSizeInPixels, + m_data->m_multiThreadedHelper->m_startPixelIndex, + m_data->m_multiThreadedHelper->m_destinationWidth, + m_data->m_multiThreadedHelper->m_destinationHeight, + m_data->m_multiThreadedHelper->m_numPixelsCopied); + m_data->m_multiThreadedHelper->getCriticalSection()->lock(); + m_data->m_multiThreadedHelper->getCriticalSection()->setSharedParam(1,eRobotSimGUIHelperIdle); + m_data->m_multiThreadedHelper->getCriticalSection()->unlock(); + + break; + } case eRobotSimGUIHelperIdle: default: { @@ -669,9 +717,9 @@ bool b3RobotSimAPI::loadFile(const struct b3RobotSimLoadFileArgs& args, b3RobotS bool b3RobotSimAPI::connect(GUIHelperInterface* guiHelper) { - m_data->m_multiThreadedHelper = new MultiThreadedOpenGLGuiHelper(guiHelper->getAppInterface(),guiHelper); + m_data->m_multiThreadedHelper = new MultiThreadedOpenGLGuiHelper2(guiHelper->getAppInterface(),guiHelper); - MultiThreadedOpenGLGuiHelper* guiHelperWrapper = new MultiThreadedOpenGLGuiHelper(guiHelper->getAppInterface(),guiHelper); + MultiThreadedOpenGLGuiHelper2* guiHelperWrapper = new MultiThreadedOpenGLGuiHelper2(guiHelper->getAppInterface(),guiHelper); diff --git a/examples/SharedMemory/PhysicsClientC_API.cpp b/examples/SharedMemory/PhysicsClientC_API.cpp index 23dc57826..fbb773854 100644 --- a/examples/SharedMemory/PhysicsClientC_API.cpp +++ b/examples/SharedMemory/PhysicsClientC_API.cpp @@ -825,7 +825,7 @@ void b3RequestCameraImageSetCameraMatrices(b3SharedMemoryCommandHandle commandHa command->m_updateFlags |= REQUEST_PIXEL_ARGS_HAS_CAMERA_MATRICES; } -void b3RequestCameraImageSetViewMatrix2(b3SharedMemoryCommandHandle commandHandle, const float cameraTargetPosition[3], float distance, float yaw, float pitch, int upAxis) +void b3RequestCameraImageSetViewMatrix2(b3SharedMemoryCommandHandle commandHandle, const float cameraTargetPosition[3], float distance, float yaw, float pitch, float roll, int upAxis) { struct SharedMemoryCommand* command = (struct SharedMemoryCommand*) commandHandle; b3Assert(command); @@ -834,47 +834,78 @@ void b3RequestCameraImageSetViewMatrix2(b3SharedMemoryCommandHandle commandHandl b3Vector3 camForward; b3Vector3 camPos; b3Vector3 camTargetPos = b3MakeVector3(cameraTargetPosition[0],cameraTargetPosition[1],cameraTargetPosition[2]); - + b3Vector3 eyePos = b3MakeVector3(0,0,0); + int forwardAxis(-1); + + { + switch (upAxis) { - case 1: - forwardAxis = 2; - camUpVector = b3MakeVector3(0,1,0); - //gLightPos = b3MakeVector3(-50.f,100,30); - break; - case 2: - forwardAxis = 1; - camUpVector = b3MakeVector3(0,0,1); - //gLightPos = b3MakeVector3(-50.f,30,100); - break; - default: - { - //b3Assert(0); - return; - } - }; - - b3Vector3 eyePos = b3MakeVector3(0,0,0); - eyePos[forwardAxis] = -distance; - - camForward = b3MakeVector3(eyePos[0],eyePos[1],eyePos[2]); - if (camForward.length2() < B3_EPSILON) - { - camForward.setValue(1.f,0.f,0.f); - } else - { - camForward.normalize(); + + case 1: + { + + + forwardAxis = 0; + eyePos[forwardAxis] = -distance; + camForward = b3MakeVector3(eyePos[0],eyePos[1],eyePos[2]); + if (camForward.length2() < B3_EPSILON) + { + camForward.setValue(1.f,0.f,0.f); + } else + { + camForward.normalize(); + } + b3Scalar rollRad = roll * b3Scalar(0.01745329251994329547); + b3Quaternion rollRot(camForward,rollRad); + + camUpVector = b3QuatRotate(rollRot,b3MakeVector3(0,1,0)); + //gLightPos = b3MakeVector3(-50.f,100,30); + break; + } + case 2: + { + + + forwardAxis = 1; + eyePos[forwardAxis] = -distance; + camForward = b3MakeVector3(eyePos[0],eyePos[1],eyePos[2]); + if (camForward.length2() < B3_EPSILON) + { + camForward.setValue(1.f,0.f,0.f); + } else + { + camForward.normalize(); + } + + b3Scalar rollRad = roll * b3Scalar(0.01745329251994329547); + b3Quaternion rollRot(camForward,rollRad); + + camUpVector = b3QuatRotate(rollRot,b3MakeVector3(0,0,1)); + //gLightPos = b3MakeVector3(-50.f,30,100); + break; + } + default: + { + //b3Assert(0); + return; + } + }; } + - b3Scalar rele = yaw * b3Scalar(0.01745329251994329547);// rads per deg - b3Scalar razi = pitch * b3Scalar(0.01745329251994329547);// rads per deg - b3Quaternion rot(camUpVector,razi); + b3Scalar yawRad = yaw * b3Scalar(0.01745329251994329547);// rads per deg + b3Scalar pitchRad = pitch * b3Scalar(0.01745329251994329547);// rads per deg + + b3Quaternion pitchRot(camUpVector,pitchRad); b3Vector3 right = camUpVector.cross(camForward); - b3Quaternion roll(right,-rele); + b3Quaternion yawRot(right,-yawRad); + + - eyePos = b3Matrix3x3(rot) * b3Matrix3x3(roll) * eyePos; + eyePos = b3Matrix3x3(pitchRot) * b3Matrix3x3(yawRot) * eyePos; camPos = eyePos; camPos += camTargetPos; diff --git a/examples/SharedMemory/PhysicsClientC_API.h b/examples/SharedMemory/PhysicsClientC_API.h index 588f810a8..f55876fbd 100644 --- a/examples/SharedMemory/PhysicsClientC_API.h +++ b/examples/SharedMemory/PhysicsClientC_API.h @@ -71,7 +71,7 @@ void b3GetDebugLines(b3PhysicsClientHandle physClient, struct b3DebugLines* l b3SharedMemoryCommandHandle b3InitRequestCameraImage(b3PhysicsClientHandle physClient); void b3RequestCameraImageSetCameraMatrices(b3SharedMemoryCommandHandle command, float viewMatrix[16], float projectionMatrix[16]); void b3RequestCameraImageSetViewMatrix(b3SharedMemoryCommandHandle command, const float cameraPosition[3], const float cameraTargetPosition[3], const float cameraUp[3]); -void b3RequestCameraImageSetViewMatrix2(b3SharedMemoryCommandHandle commandHandle, const float cameraTargetPosition[3], float distance, float yaw, float pitch, int upAxis); +void b3RequestCameraImageSetViewMatrix2(b3SharedMemoryCommandHandle commandHandle, const float cameraTargetPosition[3], float distance, float yaw, float pitch, float roll, int upAxis); void b3RequestCameraImageSetProjectionMatrix(b3SharedMemoryCommandHandle command, float left, float right, float bottom, float top, float nearVal, float farVal); void b3RequestCameraImageSetFOVProjectionMatrix(b3SharedMemoryCommandHandle command, float fov, float aspect, float nearVal, float farVal); void b3RequestCameraImageSetPixelResolution(b3SharedMemoryCommandHandle command, int width, int height ); diff --git a/examples/SharedMemory/PhysicsClientExample.cpp b/examples/SharedMemory/PhysicsClientExample.cpp index b5788bd09..017e67a53 100644 --- a/examples/SharedMemory/PhysicsClientExample.cpp +++ b/examples/SharedMemory/PhysicsClientExample.cpp @@ -259,15 +259,15 @@ void PhysicsClientExample::prepareAndSubmitCommand(int commandId) b3SharedMemoryCommandHandle commandHandle = b3InitRequestCameraImage(m_physicsClientHandle); //b3RequestCameraImageSelectRenderer(commandHandle,ER_BULLET_HARDWARE_OPENGL); - float viewMatrix[16]; - float projectionMatrix[16]; - m_guiHelper->getRenderInterface()->getActiveCamera()->getCameraProjectionMatrix(projectionMatrix); + float viewMatrix[16]; + float projectionMatrix[16]; + m_guiHelper->getRenderInterface()->getActiveCamera()->getCameraProjectionMatrix(projectionMatrix); m_guiHelper->getRenderInterface()->getActiveCamera()->getCameraViewMatrix(viewMatrix); b3RequestCameraImageSetCameraMatrices(commandHandle, viewMatrix,projectionMatrix); - b3RequestCameraImageSetPixelResolution(commandHandle, camVisualizerWidth,camVisualizerHeight); - b3SubmitClientCommand(m_physicsClientHandle, commandHandle); - break; + b3RequestCameraImageSetPixelResolution(commandHandle, camVisualizerWidth,camVisualizerHeight); + b3SubmitClientCommand(m_physicsClientHandle, commandHandle); + break; } case CMD_CREATE_BOX_COLLISION_SHAPE: { diff --git a/examples/SharedMemory/PhysicsClientSharedMemory.cpp b/examples/SharedMemory/PhysicsClientSharedMemory.cpp index fa4362caf..fc807fabb 100644 --- a/examples/SharedMemory/PhysicsClientSharedMemory.cpp +++ b/examples/SharedMemory/PhysicsClientSharedMemory.cpp @@ -609,7 +609,7 @@ const SharedMemoryStatus* PhysicsClientSharedMemory::processServerStatus() { { SharedMemoryCommand& command = m_data->m_testBlock1->m_clientCommands[0]; - if (serverCmd.m_sendPixelDataArguments.m_numRemainingPixels > 0) + if (serverCmd.m_sendPixelDataArguments.m_numRemainingPixels > 0 && serverCmd.m_sendPixelDataArguments.m_numPixelsCopied) { diff --git a/examples/SharedMemory/PhysicsDirect.cpp b/examples/SharedMemory/PhysicsDirect.cpp index 511290778..2f1b1f413 100644 --- a/examples/SharedMemory/PhysicsDirect.cpp +++ b/examples/SharedMemory/PhysicsDirect.cpp @@ -225,7 +225,7 @@ bool PhysicsDirect::processCamera(const struct SharedMemoryCommand& orgCommand) = rgbaPixelsReceived[i]; } - if (serverCmd.m_sendPixelDataArguments.m_numRemainingPixels > 0) + if (serverCmd.m_sendPixelDataArguments.m_numRemainingPixels > 0 && serverCmd.m_sendPixelDataArguments.m_numPixelsCopied) { @@ -241,7 +241,7 @@ bool PhysicsDirect::processCamera(const struct SharedMemoryCommand& orgCommand) m_data->m_cachedCameraPixelsHeight = serverCmd.m_sendPixelDataArguments.m_imageHeight; } } - } while (serverCmd.m_sendPixelDataArguments.m_numRemainingPixels > 0); + } while (serverCmd.m_sendPixelDataArguments.m_numRemainingPixels > 0 && serverCmd.m_sendPixelDataArguments.m_numPixelsCopied); return m_data->m_hasStatus; diff --git a/examples/SharedMemory/PhysicsServerExample.cpp b/examples/SharedMemory/PhysicsServerExample.cpp index 75e475738..53ef9ca31 100644 --- a/examples/SharedMemory/PhysicsServerExample.cpp +++ b/examples/SharedMemory/PhysicsServerExample.cpp @@ -43,6 +43,7 @@ enum MultiThreadedGUIHelperCommunicationEnums eGUIHelperCreateCollisionShapeGraphicsObject, eGUIHelperCreateCollisionObjectGraphicsObject, eGUIHelperRemoveAllGraphicsInstances, + eGUIHelperCopyCameraImageData, }; #include @@ -392,11 +393,41 @@ public: { } - virtual void copyCameraImageData(const float viewMatrix[16], const float projectionMatrix[16], unsigned char* pixelsRGBA, int rgbaBufferSizeInPixels, float* depthBuffer, int depthBufferSizeInPixels, int startPixelIndex, int width, int height, int* numPixelsCopied) + float m_viewMatrix[16]; + float m_projectionMatrix[16]; + unsigned char* m_pixelsRGBA; + int m_rgbaBufferSizeInPixels; + float* m_depthBuffer; + int m_depthBufferSizeInPixels; + int m_startPixelIndex; + int m_destinationWidth; + int m_destinationHeight; + int* m_numPixelsCopied; + + virtual void copyCameraImageData(const float viewMatrix[16], const float projectionMatrix[16], unsigned char* pixelsRGBA, int rgbaBufferSizeInPixels, float* depthBuffer, int depthBufferSizeInPixels, int startPixelIndex, int destinationWidth, int destinationHeight, int* numPixelsCopied) { - if (numPixelsCopied) - *numPixelsCopied = 0; + m_cs->lock(); + for (int i=0;i<16;i++) + { + m_viewMatrix[i] = viewMatrix[i]; + m_projectionMatrix[i] = projectionMatrix[i]; + } + m_pixelsRGBA = pixelsRGBA; + m_rgbaBufferSizeInPixels = rgbaBufferSizeInPixels; + m_depthBuffer = depthBuffer; + m_depthBufferSizeInPixels = depthBufferSizeInPixels; + m_startPixelIndex = startPixelIndex; + m_destinationWidth = destinationWidth; + m_destinationHeight = destinationHeight; + m_numPixelsCopied = numPixelsCopied; + + m_cs->setSharedParam(1,eGUIHelperCopyCameraImageData); + m_cs->unlock(); + while (m_cs->getSharedParam(1)!=eGUIHelperIdle) + { + } } + virtual void autogenerateGraphicsObjects(btDiscreteDynamicsWorld* rbWorld) { @@ -727,6 +758,24 @@ void PhysicsServerExample::stepSimulation(float deltaTime) m_multiThreadedHelper->getCriticalSection()->unlock(); break; } + + case eGUIHelperCopyCameraImageData: + { + m_multiThreadedHelper->m_childGuiHelper->copyCameraImageData(m_multiThreadedHelper->m_viewMatrix, + m_multiThreadedHelper->m_projectionMatrix, + m_multiThreadedHelper->m_pixelsRGBA, + m_multiThreadedHelper->m_rgbaBufferSizeInPixels, + m_multiThreadedHelper->m_depthBuffer, + m_multiThreadedHelper->m_depthBufferSizeInPixels, + m_multiThreadedHelper->m_startPixelIndex, + m_multiThreadedHelper->m_destinationWidth, + m_multiThreadedHelper->m_destinationHeight, + m_multiThreadedHelper->m_numPixelsCopied); + m_multiThreadedHelper->getCriticalSection()->lock(); + m_multiThreadedHelper->getCriticalSection()->setSharedParam(1,eGUIHelperIdle); + m_multiThreadedHelper->getCriticalSection()->unlock(); + break; + } case eGUIHelperIdle: default: { diff --git a/examples/pybullet/pybullet.c b/examples/pybullet/pybullet.c index ba34093e8..e00c5f0af 100644 --- a/examples/pybullet/pybullet.c +++ b/examples/pybullet/pybullet.c @@ -1154,20 +1154,21 @@ static PyObject* pybullet_renderImage(PyObject* self, PyObject* args) b3RequestCameraImageSetFOVProjectionMatrix(command, fov, aspect, nearVal, farVal); } } - else if (size==10) + else if (size==11) { int upAxisIndex=1; - float camDistance,yaw,pitch; + float camDistance,yaw,pitch,roll; //sometimes more arguments are better :-) - if (PyArg_ParseTuple(args, "iiOfffifff", &width, &height, &objTargetPos, &camDistance, &yaw, &pitch, &upAxisIndex, &nearVal, &farVal, &fov)) + if (PyArg_ParseTuple(args, "iiOffffifff", &width, &height, &objTargetPos, &camDistance, &yaw, &pitch, &roll, &upAxisIndex, &nearVal, &farVal, &fov)) { + b3RequestCameraImageSetPixelResolution(command,width,height); if (pybullet_internalSetVector(objTargetPos, targetPos)) { //printf("width = %d, height = %d, targetPos = %f,%f,%f, distance = %f, yaw = %f, pitch = %f, upAxisIndex = %d, near=%f, far=%f, fov=%f\n",width,height,targetPos[0],targetPos[1],targetPos[2],camDistance,yaw,pitch,upAxisIndex,nearVal,farVal,fov); - b3RequestCameraImageSetViewMatrix2(command,targetPos,camDistance,yaw,pitch,upAxisIndex); + b3RequestCameraImageSetViewMatrix2(command,targetPos,camDistance,yaw,pitch,roll,upAxisIndex); aspect = width/height; b3RequestCameraImageSetFOVProjectionMatrix(command, fov, aspect, nearVal, farVal); } else @@ -1193,6 +1194,9 @@ static PyObject* pybullet_renderImage(PyObject* self, PyObject* args) { b3SharedMemoryStatusHandle statusHandle; int statusType; + + //b3RequestCameraImageSelectRenderer(command,ER_BULLET_HARDWARE_OPENGL); + statusHandle = b3SubmitClientCommandAndWaitStatus(sm, command); statusType = b3GetStatusType(statusHandle); if (statusType==CMD_CAMERA_IMAGE_COMPLETED) diff --git a/examples/pybullet/testrender.py b/examples/pybullet/testrender.py index 7ba07e4e7..da96bbbc5 100644 --- a/examples/pybullet/testrender.py +++ b/examples/pybullet/testrender.py @@ -6,14 +6,16 @@ pybullet.connect(pybullet.GUI) pybullet.loadURDF("r2d2.urdf") camTargetPos = [0,0,0] -#cameraUp = [0,0,1] -cameraPos = [3,3,3] -yaw = 40.0 -pitch = 0.0 -upAxisIndex = 1 -camDistance = 3 -pixelWidth = 640 -pixelHeight = 480 +cameraUp = [0,0,1] +cameraPos = [1,1,1] +yaw = 40 +pitch = 10.0 + +roll=0 +upAxisIndex = 2 +camDistance = 4 +pixelWidth = 320 +pixelHeight = 240 nearPlane = 0.01 farPlane = 1000 @@ -22,19 +24,23 @@ fov = 60 #img_arr = pybullet.renderImage(pixelWidth, pixelHeight) #renderImage(w, h, view[16], projection[16]) #img_arr = pybullet.renderImage(pixelWidth, pixelHeight, cameraPos, camTargetPos, cameraUp, nearPlane, farPlane) -img_arr = pybullet.renderImage(pixelWidth, pixelHeight, camTargetPos, camDistance, yaw, pitch, upAxisIndex, nearPlane, farPlane, fov) +for pitch in range (0,360,10) : + img_arr = pybullet.renderImage(pixelWidth, pixelHeight, camTargetPos, camDistance, yaw, pitch, roll, upAxisIndex, nearPlane, farPlane, fov) -w=img_arr[0] #width of the image, in pixels -h=img_arr[1] #height of the image, in pixels -rgb=img_arr[2] #color data RGB -dep=img_arr[3] #depth data + w=img_arr[0] #width of the image, in pixels + h=img_arr[1] #height of the image, in pixels + rgb=img_arr[2] #color data RGB + dep=img_arr[3] #depth data + #print 'width = %d height = %d' % (w,h) -# reshape creates np array -np_img_arr = np.reshape(rgb, (pixelHeight, pixelWidth, 4)) -np_img_arr = np_img_arr*(1./255.) + # reshape creates np array + np_img_arr = np.reshape(rgb, (h, w, 4)) + np_img_arr = np_img_arr*(1./255.) -#show -plt.imshow(np_img_arr,interpolation='none') -plt.show() -p.resetSimulation() + #show + plt.imshow(np_img_arr,interpolation='none') + #plt.show() + plt.pause(0.01) + +pybullet.resetSimulation()