From fd89ed9efa7f2259bda271a2d300e1c0b0a82e1a Mon Sep 17 00:00:00 2001 From: Samuel Felton Date: Mon, 22 Apr 2024 18:16:10 +0200 Subject: [PATCH] add small model, add argument parsing --- tutorial/ar/data/deformed_sphere.bam | Bin 0 -> 57657 bytes tutorial/ar/tutorial-panda3d-renderer.cpp | 58 ++++++++++++++++------ 2 files changed, 42 insertions(+), 16 deletions(-) create mode 100644 tutorial/ar/data/deformed_sphere.bam diff --git a/tutorial/ar/data/deformed_sphere.bam b/tutorial/ar/data/deformed_sphere.bam new file mode 100644 index 0000000000000000000000000000000000000000..4da7885825c789842bec09a9fb0e1ccd957e1ea5 GIT binary patch literal 57657 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 literal 0 HcmV?d00001 diff --git a/tutorial/ar/tutorial-panda3d-renderer.cpp b/tutorial/ar/tutorial-panda3d-renderer.cpp index f601f490cb..fb789e4ec0 100644 --- a/tutorial/ar/tutorial-panda3d-renderer.cpp +++ b/tutorial/ar/tutorial-panda3d-renderer.cpp @@ -1,7 +1,7 @@ //! \example tutorial-panda3d-renderer.cpp #include #include -#if defined(VISP_HAVE_PANDA3D) && defined(VISP_HAVE_DISPLAY) +#if defined(VISP_HAVE_PANDA3D) && defined(VISP_HAVE_DISPLAY) && defined(VISP_HAVE_MODULE_IO) #include #include @@ -12,7 +12,7 @@ #include #include - +#include #include #include @@ -47,8 +47,34 @@ void displayDepth(const vpImage &depthImage, vpDisplay::flush(depthDisplayImage); } -int main() + + +int main(int argc, const char **argv) { + bool invertTexture = false; + std::string modelPathCstr; + vpParseArgv::vpArgvInfo argTable[] = + { + {"-invert", vpParseArgv::ARGV_CONSTANT_BOOL, 0, (char *)&invertTexture, + "Whether to force Texture inversion. Use this if the model is upside down."}, + {"-model", vpParseArgv::ARGV_STRING, (char *) nullptr, (char *)&modelPathCstr, + "Path to the model to load."}, + {"-h", vpParseArgv::ARGV_HELP, (char *) nullptr, (char *) nullptr, + "Print the help."}, + {(char *) nullptr, vpParseArgv::ARGV_END, (char *) nullptr, (char *) nullptr, (char *) nullptr} }; + + // Read the command line options + if (vpParseArgv::parse(&argc, argv, argTable, + vpParseArgv::ARGV_NO_LEFTOVERS | + vpParseArgv::ARGV_NO_ABBREV | + vpParseArgv::ARGV_NO_DEFAULTS)) { + return (false); + } + + std::string modelPath(modelPathCstr); + if (modelPath.size() == 0) { + modelPath = "data/deformed_sphere.bam"; + } vpPanda3DRenderParameters renderParams(vpCameraParameters(300, 300, 160, 120), 240, 320, 0.01, 1.0); vpPanda3DRendererSet renderer(renderParams); renderer.setRenderParameters(renderParams); @@ -65,39 +91,37 @@ int main() renderer.setVerticalSyncEnabled(false); renderer.setAbortOnPandaError(true); - renderer.setForcedInvertTextures(true); + if (invertTexture) { + renderer.setForcedInvertTextures(true); + } std::cout << "Initializing framework" << std::endl; renderer.initFramework(false); std::cout << "Loading object" << std::endl; - NodePath object = renderer.loadObject(objectName, "/home/sfelton/buddha.bam"); + NodePath object = renderer.loadObject(objectName, modelPath); std::cout << "Adding node to scene" <getRenderRoot().set_shader_auto(100); + PT(AmbientLight) alight = new AmbientLight("ambient"); + alight->set_color(LColor(0.2, 0.2, 0.2, 1)); + NodePath alnp = rgbRenderer->getRenderRoot().attach_new_node(alight); + rgbRenderer->getRenderRoot().set_light(alnp); PT(PointLight) plight = new PointLight("sun"); plight->set_color(LColor(2.0, 2.0, 2.0, 1)); NodePath plnp = rgbRenderer->getRenderRoot().attach_new_node(plight); plnp.set_pos(0.4, -0.5, 0.1); rgbRenderer->getRenderRoot().set_light(plnp); - // NodePath dlnp = rgbRenderer->getRenderRoot().attach_new_node(d_light); - // dlnp.set_hpr(-30, -60, 0); - // rgbRenderer->getRenderRoot().set_light(dlnp); - // PT(AmbientLight) a_light = new AmbientLight("my a_light"); - // a_light->set_color(LColor(1.0, 1.0, 1.0, 1.0)); - // NodePath alnp = rgbRenderer->getRenderRoot().attach_new_node(a_light); - // rgbRenderer->getRenderRoot().set_light(alnp); - std::cout << "Setting camera pose" << std::endl; - renderer.setCameraPose(vpHomogeneousMatrix(0.0, -0.4, 0.0, 0.0, 0.0, 0.0)); + renderer.setCameraPose(vpHomogeneousMatrix(0.0, 0.0, -0.5, 0.0, 0.0, 0.0)); vpImage normalsImage; vpImage cameraNormalsImage; - vpImage depthImage; + vpImage colorImage(renderParams.getImageHeight(), renderParams.getImageWidth()); vpImage normalDisplayImage(renderParams.getImageHeight(), renderParams.getImageWidth()); vpImage cameraNormalDisplayImage(renderParams.getImageHeight(), renderParams.getImageWidth()); @@ -150,7 +174,9 @@ int main() const double afterAll = vpTime::measureTimeMs(); const double delta = (afterAll - beforeRender) / 1000.0; vpHomogeneousMatrix wTo = renderer.getNodePose(objectName); - vpHomogeneousMatrix oToo = vpExponentialMap::direct(vpColVector({ 0.0, 0.0, 0.0, 0.0, 0.0, vpMath::rad(20.0) }), delta); + std::cout << wTo << std::endl; + + vpHomogeneousMatrix oToo = vpExponentialMap::direct(vpColVector({ 0.0, 0.0, 0.0, 0.0, vpMath::rad(20.0), 0.0 }), delta); renderer.setNodePose(objectName, wTo * oToo); std::cout << "Rendering took: " << std::fixed << std::setprecision(2) << beforeFetch - beforeRender << "ms" << std::endl; std::cout << "Copying to vpImage took: " << std::fixed << std::setprecision(2) << beforeConvert - beforeFetch << "ms" << std::endl;