3D Well Log Curves (#2674): Show what the value axis direction is

This commit is contained in:
Gaute Lindkvist
2018-04-19 13:35:11 +02:00
parent 4dc9d1ba8a
commit 5d89ad3a6d
7 changed files with 126 additions and 31 deletions

View File

@@ -25,12 +25,14 @@
#include "RigWellPathGeometryTools.h"
#include "cafDisplayCoordTransform.h"
#include "cvfObject.h"
#include "cvfDrawableGeo.h"
#include "cvfPrimitiveSetIndexedUInt.h"
#include "cvfBoundingBox.h"
#include "cvfGeometryBuilderTriangles.h"
#include "cvfArrowGenerator.h"
#include <algorithm>
#include <map>
//--------------------------------------------------------------------------------------------------
@@ -195,34 +197,38 @@ Riv3dWellLogGridGeometryGenerator::createGrid(const caf::DisplayCoordTransform*
}
std::vector<cvf::Vec3f> vertices;
std::vector<cvf::Vec3f> arrowVectors;
vertices.reserve(interpolatedGridPoints.size());
arrowVectors.reserve(interpolatedGridPoints.size());
std::vector<cvf::uint> indices;
indices.reserve(interpolatedGridPoints.size());
cvf::uint indexCounter = 0;
// Normal lines. Start from one to avoid drawing at surface edge.
double shaftRelativeRadius = 0.0125f;
double arrowHeadRelativeRadius = shaftRelativeRadius * 3;
double arrowHeadRelativeLength = arrowHeadRelativeRadius * 3;
double totalArrowScaling = 1.0 / (1.0 - arrowHeadRelativeLength);
// Normal lines. Start from one to avoid drawing at surface edge.
for (size_t i = 1; i < interpolatedGridCurveNormals.size(); i++)
{
vertices.push_back(cvf::Vec3f(interpolatedGridPoints[i] + interpolatedGridCurveNormals[i] * planeOffsetFromWellPathCenter));
vertices.push_back(cvf::Vec3f(interpolatedGridPoints[i] + interpolatedGridCurveNormals[i] * (planeOffsetFromWellPathCenter + planeWidth)));
indices.push_back(indexCounter++);
indices.push_back(indexCounter++);
arrowVectors.push_back(cvf::Vec3f(interpolatedGridCurveNormals[i] * planeWidth * totalArrowScaling));
}
cvf::ref<cvf::PrimitiveSetIndexedUInt> indexedUInt = new cvf::PrimitiveSetIndexedUInt(cvf::PrimitiveType::PT_LINES);
cvf::ref<cvf::UIntArray> indexArray = new cvf::UIntArray(indices);
cvf::ref<cvf::DrawableGeo> normalLinesDrawable = new cvf::DrawableGeo();
indexedUInt->setIndices(indexArray.p());
normalLinesDrawable->addPrimitiveSet(indexedUInt.p());
m_curveNormalVectors = new cvf::DrawableVectors();
cvf::ref<cvf::Vec3fArray> vertexArray = new cvf::Vec3fArray(vertices);
normalLinesDrawable->setVertexArray(vertexArray.p());
cvf::ref<cvf::Vec3fArray> vectorArray = new cvf::Vec3fArray(arrowVectors);
m_curveNormalLines = normalLinesDrawable;
// Create the arrow glyph for the vector drawer
cvf::GeometryBuilderTriangles arrowBuilder;
cvf::ArrowGenerator gen;
gen.setShaftRelativeRadius(shaftRelativeRadius);
gen.setHeadRelativeRadius(arrowHeadRelativeRadius);
gen.setHeadRelativeLength(arrowHeadRelativeLength);
gen.setNumSlices(4);
gen.generate(&arrowBuilder);
m_curveNormalVectors->setGlyph(arrowBuilder.trianglesUShort().p(), arrowBuilder.vertices().p());
m_curveNormalVectors->setVectors(vertexArray.p(), vectorArray.p());
}
return true;
}
@@ -237,9 +243,9 @@ cvf::ref<cvf::DrawableGeo> Riv3dWellLogGridGeometryGenerator::border()
return m_border;
}
cvf::ref<cvf::DrawableGeo> Riv3dWellLogGridGeometryGenerator::curveNormalLines()
cvf::ref<cvf::DrawableVectors> Riv3dWellLogGridGeometryGenerator::curveNormalVectors()
{
return m_curveNormalLines;
return m_curveNormalVectors;
}
//--------------------------------------------------------------------------------------------------

View File

@@ -20,6 +20,7 @@
#include "cvfBase.h"
#include "cvfDrawableGeo.h"
#include "cvfDrawableVectors.h"
#include "cvfObject.h"
#include "cafPdmPointer.h"
@@ -53,13 +54,13 @@ public:
cvf::ref<cvf::DrawableGeo> background();
cvf::ref<cvf::DrawableGeo> border();
cvf::ref<cvf::DrawableGeo> curveNormalLines();
cvf::ref<cvf::DrawableVectors> curveNormalVectors();
private:
const RigWellPath* wellPathGeometry() const;
private:
caf::PdmPointer<RimWellPath> m_wellPath;
cvf::ref<cvf::DrawableGeo> m_background;
cvf::ref<cvf::DrawableGeo> m_border;
cvf::ref<cvf::DrawableGeo> m_curveNormalLines;
caf::PdmPointer<RimWellPath> m_wellPath;
cvf::ref<cvf::DrawableGeo> m_background;
cvf::ref<cvf::DrawableGeo> m_border;
cvf::ref<cvf::DrawableVectors> m_curveNormalVectors;
};

View File

@@ -18,8 +18,9 @@
#include "Riv3dWellLogPlanePartMgr.h"
#include "RiaColorTables.h"
#include "RiaApplication.h"
#include "RiuViewer.h"
#include "Rim3dView.h"
#include "Rim3dWellLogCurveCollection.h"
#include "RimCase.h"
@@ -36,7 +37,9 @@
#include "cvfColor3.h"
#include "cvfDrawableGeo.h"
#include "cvfModelBasicList.h"
#include "cvfOpenGLResourceManager.h"
#include "cvfPart.h"
#include "cvfShaderProgram.h"
#include <utility>
@@ -225,9 +228,10 @@ void Riv3dWellLogPlanePartMgr::appendGridToModel(cvf::ModelBasicList*
bool showGrid = curveCollection->isShowingGrid();
bool showBackground = curveCollection->isShowingBackground();
cvf::Color3f gridColor(0.4f, 0.4f, 0.4f);
caf::SurfaceEffectGenerator backgroundEffectGen(cvf::Color4f(1.0, 1.0, 1.0, 1.0), caf::PO_2);
caf::MeshEffectGenerator gridBorderEffectGen(cvf::Color3f(0.4f, 0.4f, 0.4f));
caf::MeshEffectGenerator curveNormalsEffectGen(cvf::Color3f(0.4f, 0.4f, 0.4f));
caf::MeshEffectGenerator gridBorderEffectGen(gridColor);
caf::VectorEffectGenerator curveNormalsEffectGen;
backgroundEffectGen.enableLighting(false);
bool gridCreated = m_3dWellLogGridGeometryGenerator->createGrid(displayCoordTransform,
@@ -241,7 +245,7 @@ void Riv3dWellLogPlanePartMgr::appendGridToModel(cvf::ModelBasicList*
cvf::ref<cvf::Effect> backgroundEffect = backgroundEffectGen.generateCachedEffect();
cvf::ref<cvf::Effect> borderEffect = gridBorderEffectGen.generateCachedEffect();
cvf::ref<cvf::Effect> curveNormalsEffect = curveNormalsEffectGen.generateCachedEffect();
cvf::ref<cvf::DrawableGeo> background = m_3dWellLogGridGeometryGenerator->background();
if (showBackground && background.notNull())
{
@@ -263,9 +267,15 @@ void Riv3dWellLogPlanePartMgr::appendGridToModel(cvf::ModelBasicList*
}
}
cvf::ref<cvf::DrawableGeo> normals = m_3dWellLogGridGeometryGenerator->curveNormalLines();
cvf::ref<cvf::DrawableVectors> normals = m_3dWellLogGridGeometryGenerator->curveNormalVectors();
if (normals.notNull())
{
normals->setSingleColor(gridColor);
if (RiaApplication::instance()->useShaders())
{
normals->setUniformNames("u_transformationMatrix", "u_color");
}
cvf::ref<cvf::Part> part = createPart(normals.p(), curveNormalsEffect.p());
if (part.notNull())
{