Re: [osg-users] Volume Rendering and Depth Buffer

2019-04-16 Thread Chris Hanson
Yeah, I wouldn't totally expect it would, but you can probably do that
intersection test yourself if needed. I think it'll be faster and more
accurate than the Z-buffer.

I did a tool that relied on the Z-buffer once. It was a bad choice...

On Tue, Apr 16, 2019 at 1:05 PM Anna Osvin  wrote:

> If you mean osgViewer::View::computeIntersections, then we tried it. For
> some reason it does not check intersections with volume model.
>
> Here is raycast intersection check code:
>
> Code:
>
> bool pickPolygonalSceneIntersection( osgViewer::View& view, const
> osg::Vec2& point2d, osg::Vec3& pickedPoint )
> {
> const osg::Camera* camera = view.getCamera();
> if ( camera == nullptr ) {
> Q_ASSERT_X( false, "bool pickPolygonalSceneIntersection( ... )",
> "View has no camera." );
> return false;
> }
>
> osgUtil::LineSegmentIntersector::Intersections intersections;
>
> if ( view.computeIntersections( camera,
> osgUtil::Intersector::CoordinateFrame::WINDOW, point2d.x(), point2d.y(),
> intersections ) )
> {
> for (osgUtil::LineSegmentIntersector::Intersections::iterator hitr
> = intersections.begin();
> hitr != intersections.end();
> ++hitr)
> {
> if (hitr->nodePath.size() > 4)
> {
> pickedPoint = hitr->getWorldIntersectPoint();
>
> return true;
> }
> }
> }
>
> return false;
> }
>
>
>
>
>
> Chris Hanson wrote:
> > Instead of reading Z depth values, can you simply run an intersection of
> the click ray-vector against the model data (polygonal and volumetric) when
> they click to place markdown points?
> >
> > On Mon, Apr 15, 2019 at 2:34 PM Anna Osvin < ()> wrote:
> >
> >
> > > We are working on medical software for Dentists. We need to render
> CBCT and give user possibility to place some markdown points on it, for
> future diagnostics. Also sometimes it's required to render polygonal jaw
> models alongside with CBCT. As I said earlier, we nailed down the rendering
> and even "hit detection", but there is a nasty bag with Z Buffer values of
> the background being incorrect, therefore user can place points onto
> nothing.
> > >
> > > ...
> > >
> > > Thank you!
> > >
> > > Cheers,
> > > Anna
> > >
> > > --
> > > Read this topic online here:
> > > http://forum.openscenegraph.org/viewtopic.php?p=75839#75839 (
> http://forum.openscenegraph.org/viewtopic.php?p=75839#75839)
> > >
> > >
> > >
> > >
> > >
> > > ___
> > > osg-users mailing list
> > >  ()
> > >
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
> (http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
> )
> > >
> >
> >
> >
> > --
> > Chris 'Xenon' Hanson, omo sanza lettere.  http://www.alphapixel.com/ (
> http://www.alphapixel.com/)
> > Training • Consulting • Contracting
> > 3D • Scene Graphs (Open Scene Graph/OSG) • OpenGL 2 • OpenGL 3 • OpenGL
> 4 • GLSL • OpenGL ES 1 • OpenGL ES 2 • OpenCL
> > Legal/IP • Forensics • Imaging • UAVs • GIS • GPS •
> osgEarth • Terrain • Telemetry • Cryptography • LIDAR • Embedded • Mobile •
> iPhone/iPad/iOS • Android
> > @alphapixel (https://twitter.com/alphapixel) facebook.com/alphapixel (
> http://facebook.com/alphapixel) (775) 623-PIXL [7495]
> >
> >  --
> > Post generated by Mail2Forum
> [/code]
>
> --
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=75845#75845
>
>
>
>
>
> ___
> osg-users mailing list
> osg-users@lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>


-- 
Chris 'Xenon' Hanson, omo sanza lettere. xe...@alphapixel.com
http://www.alphapixel.com/
Training • Consulting • Contracting
3D • Scene Graphs (Open Scene Graph/OSG) • OpenGL 2 • OpenGL 3 • OpenGL 4 •
GLSL • OpenGL ES 1 • OpenGL ES 2 • OpenCL
Legal/IP • Forensics • Imaging • UAVs • GIS • GPS •
osgEarth • Terrain • Telemetry • Cryptography • LIDAR • Embedded • Mobile •
iPhone/iPad/iOS • Android
@alphapixel  facebook.com/alphapixel (775)
623-PIXL [7495]
___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


Re: [osg-users] Volume Rendering and Depth Buffer

2019-04-16 Thread Anna Osvin
If you mean osgViewer::View::computeIntersections, then we tried it. For some 
reason it does not check intersections with volume model.

Here is raycast intersection check code:

Code:

bool pickPolygonalSceneIntersection( osgViewer::View& view, const osg::Vec2& 
point2d, osg::Vec3& pickedPoint )
{
const osg::Camera* camera = view.getCamera();
if ( camera == nullptr ) {
Q_ASSERT_X( false, "bool pickPolygonalSceneIntersection( ... )", "View 
has no camera." );
return false;
}

osgUtil::LineSegmentIntersector::Intersections intersections;

if ( view.computeIntersections( camera, 
osgUtil::Intersector::CoordinateFrame::WINDOW, point2d.x(), point2d.y(), 
intersections ) )
{
for (osgUtil::LineSegmentIntersector::Intersections::iterator hitr = 
intersections.begin();
hitr != intersections.end();
++hitr)
{
if (hitr->nodePath.size() > 4)
{
pickedPoint = hitr->getWorldIntersectPoint();

return true;
}
}
}

return false;
}





Chris Hanson wrote:
> Instead of reading Z depth values, can you simply run an intersection of the 
> click ray-vector against the model data (polygonal and volumetric) when they 
> click to place markdown points?
> 
> On Mon, Apr 15, 2019 at 2:34 PM Anna Osvin < ()> wrote:
> 
> 
> > We are working on medical software for Dentists. We need to render CBCT and 
> > give user possibility to place some markdown points on it, for future 
> > diagnostics. Also sometimes it's required to render polygonal jaw models 
> > alongside with CBCT. As I said earlier, we nailed down the rendering and 
> > even "hit detection", but there is a nasty bag with Z Buffer values of the 
> > background being incorrect, therefore user can place points onto nothing.
> > 
> > ... 
> > 
> > Thank you!
> > 
> > Cheers,
> > Anna
> > 
> > --
> > Read this topic online here:
> > http://forum.openscenegraph.org/viewtopic.php?p=75839#75839 
> > (http://forum.openscenegraph.org/viewtopic.php?p=75839#75839)
> > 
> > 
> > 
> > 
> > 
> > ___
> > osg-users mailing list
> >  ()
> > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org 
> > (http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org)
> > 
> 
> 
> 
> -- 
> Chris 'Xenon' Hanson, omo sanza lettere.  http://www.alphapixel.com/ 
> (http://www.alphapixel.com/)
> Training • Consulting • Contracting
> 3D • Scene Graphs (Open Scene Graph/OSG) • OpenGL 2 • OpenGL 3 • OpenGL 4 • 
> GLSL • OpenGL ES 1 • OpenGL ES 2 • OpenCL
> Legal/IP • Forensics • Imaging • UAVs • GIS • GPS • osgEarth • Terrain • 
> Telemetry • Cryptography • LIDAR • Embedded • Mobile • iPhone/iPad/iOS • 
> Android
> @alphapixel (https://twitter.com/alphapixel) facebook.com/alphapixel 
> (http://facebook.com/alphapixel) (775) 623-PIXL [7495]
> 
>  --
> Post generated by Mail2Forum
[/code]

--
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=75845#75845





___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


Re: [osg-users] Volume Rendering and Depth Buffer

2019-04-15 Thread Chris Hanson
Instead of reading Z depth values, can you simply run an intersection of
the click ray-vector against the model data (polygonal and volumetric) when
they click to place markdown points?

On Mon, Apr 15, 2019 at 2:34 PM Anna Osvin  wrote:

> We are working on medical software for Dentists. We need to render CBCT
> and give user possibility to place some markdown points on it, for future
> diagnostics. Also sometimes it's required to render polygonal jaw models
> alongside with CBCT. As I said earlier, we nailed down the rendering and
> even "hit detection", but there is a nasty bag with Z Buffer values of the
> background being incorrect, therefore user can place points onto nothing.
>
> ...
>
> Thank you!
>
> Cheers,
> Anna
>
> --
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=75839#75839
>
>
>
>
>
> ___
> osg-users mailing list
> osg-users@lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>


-- 
Chris 'Xenon' Hanson, omo sanza lettere. xe...@alphapixel.com
http://www.alphapixel.com/
Training • Consulting • Contracting
3D • Scene Graphs (Open Scene Graph/OSG) • OpenGL 2 • OpenGL 3 • OpenGL 4 •
GLSL • OpenGL ES 1 • OpenGL ES 2 • OpenCL
Legal/IP • Forensics • Imaging • UAVs • GIS • GPS •
osgEarth • Terrain • Telemetry • Cryptography • LIDAR • Embedded • Mobile •
iPhone/iPad/iOS • Android
@alphapixel  facebook.com/alphapixel (775)
623-PIXL [7495]
___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


Re: [osg-users] Volume Rendering and Depth Buffer

2019-04-15 Thread Anna Osvin
We are working on medical software for Dentists. We need to render CBCT and 
give user possibility to place some markdown points on it, for future 
diagnostics. Also sometimes it's required to render polygonal jaw models 
alongside with CBCT. As I said earlier, we nailed down the rendering and even 
"hit detection", but there is a nasty bag with Z Buffer values of the 
background being incorrect, therefore user can place points onto nothing.

... 

Thank you!

Cheers,
Anna

--
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=75839#75839





___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


Re: [osg-users] Volume Rendering and Depth Buffer

2019-04-15 Thread Chris Hanson
Just out of curiousity, what are you volume rendering and what are your
requirements? We did some interesting volume rendering work a few years ago
for Iowa State University's Ames Lab.

On Mon, Apr 15, 2019 at 1:08 PM Anna Osvin  wrote:

> Hi. In a project that I'm working on I have an osgVolume::VolumeScene
> containing one volume model and some polygonal models. I need to do some
> depth buffer checks on that scene, so I've attached depth buffer to viewer
> camera. When I fetch osg::Image representing depth buffer content,
> everything is fine, except background values are not calculated properly
> (they should be 1, but instead it's ~0.15). And when I add osg::Depth(
> osg::Depth::Function::LESS, zNear, zFar ) attribute to the camera,
> background values are calculated correctly, but I lose all of the polygonal
> models data (they are no longer visible, and not presented in depth buffer).
>
> Here is function that does depth buffer checking:
>
> Code:
>
> bool pickZBufferIntersection( osgViewer::View& view, bool
> perspectiveProjection, const osg::Vec2& point2d, osg::Vec3& pickedPoint )
> {
> osg::Camera* camera = view.getCamera();
> if ( camera == nullptr )
> {
> Q_ASSERT_X( false, "bool pickZBufferIntersection( ... )", "View
> has no camera." );
> return false;
> }
>
> const osg::Image* zImage =
> camera->getBufferAttachmentMap()[osg::Camera::BufferComponent::DEPTH_BUFFER]._image;
> if ( zImage == nullptr )
> {
> Q_ASSERT_X( false, "bool pickZBufferIntersection( ... )", "ZBuffer
> is not attached to view camera." );
> return false;
> }
>
> osg::Vec3f cameraPos;
> osg::Vec3f center;
> osg::Vec3f up;
> camera->getViewMatrixAsLookAt( cameraPos, center, up );
>
> osg::Matrixd prInv = osg::Matrixd::inverse(
> camera->getProjectionMatrix() );
> osg::Matrixd viewInv = osg::Matrixd::inverse( camera->getViewMatrix()
> );
>
> const osg::Viewport* viewPort = camera->getViewport();
>
> int x = point2d.x() - viewPort->x();
> int y = point2d.y() - viewPort->y();
>
> osg::Vec3 s(0, 0, -1);
> s[0] = (point2d[0] / viewPort->width()) * 2.0 - 1.0;
> s[1] = (point2d[1] / viewPort->height()) * 2.0 - 1.0;
> s = s * prInv * viewInv;
>
> osg::Vec3d v = s - cameraPos;
>
> double zNear = 1.0f;
> double zFar = 1.0f;
>
> static uint pickNumber = 0;
>
> double zV, z_n, z;
> osg::Vec3f point;
>
> zV = ( (float*)zImage->data( x, y ) )[ 0 ];
>
> if( perspectiveProjection )
> {
> z_n = 2.0*zV - 1.0;
> z = 2.0 * zNear * zFar / ( zFar + zNear - z_n * ( zFar - zNear ) );
>
> point = cameraPos + v*z;
> }
> else
> {
> z = ( zFar - zNear )*zV;
> point = s + ( center - cameraPos )*z;
> }
>
> if( z > zNear + 1e-8 && z < zFar - 1 - 1e-8 )
> {
> pickedPoint = point;
> return true;
> }
> return false;
> }
>
>
>
>
> And here is viewer setup bit:
>
> Code:
>
> QWidget* createViewWidget(osgQt::GraphicsWindowQt* gw,
> osgVolume::VolumeScene& scene)
> {
> osgViewer::View* view = new osgViewer::View;
> /* ... */
> osg::Camera* camera = view->getCamera();
> camera->setGraphicsContext(gw);
>
> camera->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR);
>
> const osg::GraphicsContext::Traits* traits = gw->getTraits();
> camera->setClearColor(osgColor( SCENE3D_BACKGROUND_COLOR ));
> camera->setViewport(new osg::Viewport(0, 0, traits->width,
> traits->height));
>
> osg::ref_ptr zImage = new osg::Image();
> zImage->allocateImage(1000, 1000, 1, GL_DEPTH_COMPONENT, GL_FLOAT);
> camera->attach(osg::Camera::DEPTH_BUFFER, zImage);
>
> const int orthoRange = 120;
> const float zNear = 1.0f;
> const float zFar = 1.0f;
> camera->setProjectionMatrixAsOrtho(-orthoRange, orthoRange,
> -orthoRange, orthoRange, zNear, zFar);
> //camera->getOrCreateStateSet()->setAttribute( new osg::Depth(
> osg::Depth::Function::LESS, zNear, zFar ), osg::StateAttribute::ON |
> osg::StateAttribute::OVERRIDE );
>
> /* ... */
>
> view->setSceneData();
> view->addEventHandler(new osgViewer::StatsHandler);
>
> gw->setTouchEventsEnabled(true);
>
> return gw->getGLWidget();
> }
>
>
>
>
> ...
>
> Thank you!
>
> Cheers,
> Annie[/img]
>
> --
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=75829#75829
>
>
>
>
> Attachments:
> http://forum.openscenegraph.org//files/depth_buffer_depthrange_185.png
> http://forum.openscenegraph.org//files/depth_buffer_154.png
>
>
> ___
> osg-users mailing list
> osg-users@lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>


-- 
Chris 'Xenon' Hanson, omo sanza lettere. xe...@alphapixel.com
http://www.alphapixel.com/
Training • Consulting • Contracting
3D • Scene Graphs (Open Scene 

[osg-users] Volume Rendering and Depth Buffer

2019-04-15 Thread Anna Osvin
Hi. In a project that I'm working on I have an osgVolume::VolumeScene 
containing one volume model and some polygonal models. I need to do some depth 
buffer checks on that scene, so I've attached depth buffer to viewer camera. 
When I fetch osg::Image representing depth buffer content, everything is fine, 
except background values are not calculated properly (they should be 1, but 
instead it's ~0.15). And when I add osg::Depth( osg::Depth::Function::LESS, 
zNear, zFar ) attribute to the camera, background values are calculated 
correctly, but I lose all of the polygonal models data (they are no longer 
visible, and not presented in depth buffer).

Here is function that does depth buffer checking:

Code:

bool pickZBufferIntersection( osgViewer::View& view, bool 
perspectiveProjection, const osg::Vec2& point2d, osg::Vec3& pickedPoint )
{
osg::Camera* camera = view.getCamera();
if ( camera == nullptr )
{
Q_ASSERT_X( false, "bool pickZBufferIntersection( ... )", "View has no 
camera." );
return false;
}

const osg::Image* zImage = 
camera->getBufferAttachmentMap()[osg::Camera::BufferComponent::DEPTH_BUFFER]._image;
if ( zImage == nullptr )
{
Q_ASSERT_X( false, "bool pickZBufferIntersection( ... )", "ZBuffer is 
not attached to view camera." );
return false;
}

osg::Vec3f cameraPos;
osg::Vec3f center;
osg::Vec3f up;
camera->getViewMatrixAsLookAt( cameraPos, center, up );

osg::Matrixd prInv = osg::Matrixd::inverse( camera->getProjectionMatrix() );
osg::Matrixd viewInv = osg::Matrixd::inverse( camera->getViewMatrix() );

const osg::Viewport* viewPort = camera->getViewport();

int x = point2d.x() - viewPort->x();
int y = point2d.y() - viewPort->y();

osg::Vec3 s(0, 0, -1);
s[0] = (point2d[0] / viewPort->width()) * 2.0 - 1.0;
s[1] = (point2d[1] / viewPort->height()) * 2.0 - 1.0;
s = s * prInv * viewInv;

osg::Vec3d v = s - cameraPos;

double zNear = 1.0f;
double zFar = 1.0f;

static uint pickNumber = 0;

double zV, z_n, z;
osg::Vec3f point;

zV = ( (float*)zImage->data( x, y ) )[ 0 ];

if( perspectiveProjection )
{
z_n = 2.0*zV - 1.0;
z = 2.0 * zNear * zFar / ( zFar + zNear - z_n * ( zFar - zNear ) );

point = cameraPos + v*z;
}
else
{
z = ( zFar - zNear )*zV;
point = s + ( center - cameraPos )*z;
}

if( z > zNear + 1e-8 && z < zFar - 1 - 1e-8 )
{
pickedPoint = point;
return true;
}
return false;
}




And here is viewer setup bit:

Code:

QWidget* createViewWidget(osgQt::GraphicsWindowQt* gw, osgVolume::VolumeScene& 
scene)
{
osgViewer::View* view = new osgViewer::View;
/* ... */
osg::Camera* camera = view->getCamera();
camera->setGraphicsContext(gw);
camera->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR);

const osg::GraphicsContext::Traits* traits = gw->getTraits();
camera->setClearColor(osgColor( SCENE3D_BACKGROUND_COLOR ));
camera->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));

osg::ref_ptr zImage = new osg::Image();
zImage->allocateImage(1000, 1000, 1, GL_DEPTH_COMPONENT, GL_FLOAT);
camera->attach(osg::Camera::DEPTH_BUFFER, zImage);

const int orthoRange = 120;
const float zNear = 1.0f;
const float zFar = 1.0f;
camera->setProjectionMatrixAsOrtho(-orthoRange, orthoRange, -orthoRange, 
orthoRange, zNear, zFar);
//camera->getOrCreateStateSet()->setAttribute( new osg::Depth( 
osg::Depth::Function::LESS, zNear, zFar ), osg::StateAttribute::ON | 
osg::StateAttribute::OVERRIDE );

/* ... */

view->setSceneData();
view->addEventHandler(new osgViewer::StatsHandler);

gw->setTouchEventsEnabled(true);

return gw->getGLWidget();
}




... 

Thank you!

Cheers,
Annie[/img]

--
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=75829#75829




Attachments: 
http://forum.openscenegraph.org//files/depth_buffer_depthrange_185.png
http://forum.openscenegraph.org//files/depth_buffer_154.png


___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org