Задача простая. Мне нужно визуализовать массив точек (x,y,z). То есть просто вывести оси, подписать их, и вывести точки. Было бы хорошо, если бы была возможность врашать график.
Что лучше всего для этого выбрать?
Всё что я нашёл это qwtplot3d, но похоже проект уже несколько лет мёртв, да и не сильно она мне понравилась.
Может есть какие-нибудь решения? Навроде QCustomPlot только с 3d?
Да, есть - MathGL
Вот пример использования на Qt: http://mathgl.sourceforge.net/doc_en/Using-QMathGL.html
Сам им ещё не пользовался.
Вот вам, на всякий случай, пример рисования квадрата на шейдерах. Там рисунок "Squares.png" посмотрите, когда будете разбираться
Scene.h
C++ (Qt)
#ifndef SCENE_H
#define SCENE_H
#include <QGLWidget>
#include <QOpenGLShaderProgram>
#include <QOpenGLFunctions>
#include "Square.h"
class Scene : public QGLWidget, public QOpenGLFunctions
{
public:
Scene( QWidget *parent = 0 );
private:
void initializeGL();
void paintGL();
void resizeGL( int w, int h);
void drawSquare( const Square &square );
QOpenGLShaderProgram *m_program;
GLint m_posAttr;
GLint m_colAttr;
GLint m_matrixUniform;
Square m_square;
};
#endif // SCENE_H
Scene.cpp
C++ (Qt)
#include <QMatrix4x4>
#include "Scene.h"
Scene::Scene( QWidget *parent ) :
QGLWidget( parent ),
m_program( 0 )
{
}
void Scene::initializeGL()
{
initializeOpenGLFunctions();
m_program = new QOpenGLShaderProgram( this );
m_program->addShaderFromSourceFile( QOpenGLShader::Vertex, ":/Shaders/vShader.glsl" );
m_program->addShaderFromSourceFile( QOpenGLShader::Fragment, ":/Shaders/fShader.glsl" );
if ( !m_program->link() )
{
qWarning( "Error: unable to link a shader program" );
return;
}
m_posAttr = m_program->attributeLocation( "posAttr" );
m_colAttr = m_program->attributeLocation( "colAttr" );
m_matrixUniform = m_program->uniformLocation( "matrix" );
}
void Scene::paintGL()
{
glClear( GL_COLOR_BUFFER_BIT );
if( !m_program->bind() )
return;
QMatrix4x4 matrix;
matrix.ortho( -2.0f, 2.0f, -2.0f, 2.0f, 2.0f, -2.0f );
glPushMatrix();
{
matrix.translate( 0.0f, 0.0f, -1.0f );
m_program->setUniformValue( m_matrixUniform, matrix );
drawSquare( m_square );
}
glPopMatrix();
m_program->release();
}
void Scene::resizeGL( int w, int h )
{
if ( h == 0 )
h = 1;
glViewport( 0, 0, w, h );
}
void Scene::drawSquare( const Square &square )
{
glVertexAttribPointer( m_posAttr, 2, GL_FLOAT, GL_FALSE, 0, square.vertices.data() );
glVertexAttribPointer( m_colAttr, 3, GL_FLOAT, GL_FALSE, 0, square.colors.data() );
glEnableVertexAttribArray( m_posAttr );
glEnableVertexAttribArray( m_colAttr );
glDrawArrays( GL_TRIANGLES, 0, 6 );
glDisableVertexAttribArray( m_colAttr );
glDisableVertexAttribArray( m_posAttr );
}
vShader.glsl
C++ (Qt)
attribute highp vec4 posAttr;
uniform highp mat4 matrix;
attribute lowp vec4 colAttr;
varying lowp vec4 col;
void main()
{
col = colAttr;
gl_Position = matrix * posAttr;
}
fShader.glsl
C++ (Qt)
varying lowp vec4 col;
void main()
{
gl_FragColor = col;
}
Всё что я нашёл это qwtplot3d, но похоже проект уже несколько лет мёртв
Пациент скорее жив, чем мертв. Посмотри обновление тут www.sintegrial.com