国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于QT使用OpenGL,加載obj模型,進(jìn)行鼠標(biāo)交互

這篇具有很好參考價(jià)值的文章主要介紹了基于QT使用OpenGL,加載obj模型,進(jìn)行鼠標(biāo)交互。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

功能分析(需求分析)

  1. 基于QT平臺(tái),使用OpenGL進(jìn)行obj文件加載顯示;
  2. 使用鼠標(biāo)對(duì)場(chǎng)景進(jìn)行縮放、移動(dòng)、旋轉(zhuǎn)交互;

技術(shù)點(diǎn)分析

OpenGL

??OpenGL是基于C的,學(xué)習(xí)曲線比較抖,但是總的來(lái)說(shuō)就是下面一幅圖,
qt的opengl導(dǎo)入模型,QT/OpenGL,qt,計(jì)算機(jī)外設(shè),交互

??用語(yǔ)言簡(jiǎn)單的描述(個(gè)人理解,可能不太準(zhǔn)確)是把cpu里內(nèi)存里的3D數(shù)據(jù),傳輸?shù)斤@卡的內(nèi)存里,以及如何轉(zhuǎn)換成2D平面上像素點(diǎn)顯示(也就是矩陣變換,在好多開源的框架里都進(jìn)行了進(jìn)一步封裝,形成了渲染器、場(chǎng)景、相機(jī)等)。這個(gè)數(shù)據(jù)是頂點(diǎn)坐標(biāo)、顏色等,傳輸跟送快遞一樣,除了要有數(shù)據(jù)本身之外,還要有其他信息,也就是要有個(gè)約定,到顯卡拿到數(shù)據(jù)之后怎么解析。
??有個(gè)網(wǎng)站比較有名learnopengl,可以對(duì)著學(xué)一遍,在網(wǎng)上找資料的時(shí)候,需要注意是立即渲染模式,還是可編程渲染管線模式,現(xiàn)在官方推薦是使用可編程渲染管線模式開發(fā)。

立即渲染模式

glBegin(GL_TRIANGLES)
glTranslatef(1,2,3);
// 其他操作
// glVertex*() 設(shè)置頂點(diǎn)坐標(biāo)
// glColor*() 設(shè)置當(dāng)前顏色
// glIndex*() 設(shè)置當(dāng)前顏色表
// glNormal*() 設(shè)置法向坐標(biāo)
// glEvalCoord*() 產(chǎn)生坐標(biāo)
// glTexCoord*() 設(shè)置紋理坐標(biāo)
// glEdgeFlag*() 控制邊界繪制
// glMaterial*() 設(shè)置材質(zhì)
glEnd()

可編程渲染管線模式

1、創(chuàng)建VBO頂點(diǎn)數(shù)據(jù)對(duì)象
	GLuint VBO;
	glGenBuffers(1,&VBO);
2、VBO與顯卡緩存綁定
	glBindBuffer(GL_ARRAY_BUFFER, VBO)
3、綁定數(shù)據(jù)緩存對(duì)象
	glBufferData(GL_ARRAY_BUFFER,sizeof(vertexs),vertex,)
4、數(shù)據(jù)格式
	glVertexAttribPoint(0,3,GL_FLOAT,)
5、啟用/繪制
	glEnableVertexAttribArray(0)
	glDrawArrays(GL_TRIANGLES, 0, 10);
6、最后關(guān)閉
	glBindBuffer(GL_ARRAY_BUFFER,0)
	glBindVertexArray(0);

??以上兩段代碼只是展示兩種模式區(qū)別,很明顯立即渲染模式容易理解,但是性能有限制,可編程渲染管線模式理解和使用門檻高,但更能接觸底層。

QOpenGLWidget

??QT對(duì)OpenGL進(jìn)行了封裝,提供了QOpenGLWidget類,只需要對(duì)其繼承,在initialzeGL()resizeGL()paintGL()邏輯下進(jìn)行業(yè)務(wù)實(shí)現(xiàn),包括VBO、VAO的創(chuàng)建與綁定,著色器程序的編譯與鏈接等。

派生類 glwidget邏輯

??先簡(jiǎn)單介紹派生類的寫法,當(dāng)然為了方便擴(kuò)展和使用,抽象出了相機(jī)類、渲染器類、物體類,完整的工程代碼資源可以下載參考,具體的可以根據(jù)自己要實(shí)現(xiàn)的功能進(jìn)行編寫。

glwidget.h
#ifndef GLWIDGET_H
#define GLWIDGET_H

#include <QOpenGLWidget>
#include <QOpenGLFunctions_3_3_Core>
#include <QOpenGLShaderProgram>
#include <QOpenGLBuffer>
#include <QOpenGLVertexArrayObject>
#include <QMouseEvent>
#include <QTimer>
#include <QQuaternion>

#include <vector>
#include <QKeyEvent>

#include "utils/Common.h"
#include "genericRender.h"
#include "grid.h"
#include "coorsystem.h"
#include "camera.h"

class glwidget :public QOpenGLWidget, QOpenGLFunctions_3_3_Core
{
    Q_OBJECT
public:
    glwidget(QWidget * parent = nullptr);
    //鼠標(biāo)交互事件重寫
    void mouseMoveEvent(QMouseEvent *event) override;
    void mousePressEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;
    void wheelEvent(QWheelEvent *event) override;
    //鍵盤交互
    void keyReleaseEvent(QKeyEvent *event) override; //按鍵釋放事件
    void keyPressEvent(QKeyEvent *event) override;   //按鍵按下事件
    void slotTimeOut();
protected:
    virtual void initializeGL();
    virtual void resizeGL(int w, int h);
    virtual void paintGL();
public:
    GenericRender m_render;//渲染器
    Camera m_camera;//相機(jī)
    grid m_grid;//網(wǎng)格平面xy
    coorSystem m_coordsys;//坐標(biāo)系
    QTimer tm_;
public:
    QList<int> keys;
    QTimer* keyRespondTimer;	//頭文件中添加成員
    static int mouse_button;
    static int modifier_key;
public:
    //鼠標(biāo)變量
    static double mouse_pos_x_old;
    static double mouse_pos_y_old;
    bool changeview_ = false;            //改變視角的標(biāo)志位
    float fov = 2.0f;          //視野范圍
};
#endif // GLWIDGET_H
glwidget.cpp
#include "glwidget.h"
#include "box.h"
int glwidget::mouse_button = -1;
int glwidget::modifier_key = 0;
double glwidget::mouse_pos_x_old = 0;
double glwidget::mouse_pos_y_old = 0;
glwidget::glwidget(QWidget * parent):QOpenGLWidget(parent)
{
    keyRespondTimer = new QTimer(this);	//構(gòu)造函數(shù)中創(chuàng)建定時(shí)器對(duì)象,并連接信號(hào)槽
    connect(keyRespondTimer, &QTimer::timeout, this, &glwidget::slotTimeOut);
    setFocusPolicy(Qt::StrongFocus);//否則進(jìn)入不了鍵盤事件監(jiān)聽
}

void glwidget::initializeGL()
{
    initializeOpenGLFunctions();
    glEnable(GL_DEPTH_TEST);
    m_render.init();
    m_camera.setMatPro(fov);
    QStringList renderfiles={":/obj/data/Cayman_GT.obj", ":/obj/data/bunny_10k.obj"};
    for(QString file : renderfiles){
        Box* b1 = new Box();
        b1->load(file);
        m_render.addBox(b1);
    }
    m_grid.initize();
    m_coordsys.initize();
}

void glwidget::resizeGL(int w, int h)
{
    m_camera.setRatio((float)width() / (float)height());
}

void glwidget::paintGL()
{
    glClearColor(1.0f, 1.0f, 1.0f, 0.1f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPolygonMode(GL_FRONT, GL_LINE);
    QOpenGLExtraFunctions *f = QOpenGLContext::currentContext()->extraFunctions();
    QMatrix4x4 mMatrix;
    m_camera.setMatPro(fov);
    m_grid.paint(f,m_camera.getMatPro(),m_camera.getMatView(),mMatrix);
    m_coordsys.paint(f,m_camera.getMatPro(),m_camera.getMatView(),mMatrix);
    m_render.render(f,m_camera,mMatrix);
}

void glwidget::mousePressEvent(QMouseEvent *event){
    mouse_pos_x_old = event->pos().x();
    mouse_pos_y_old = event->pos().y();
    mouse_button = event->button();
}

void glwidget::mouseMoveEvent(QMouseEvent *event){
    int x = event->pos().x();
    int y = event->pos().y();
    double w = width(), h = height();
    double d_x = (mouse_pos_x_old - x)/w;
    double d_y = (mouse_pos_y_old - y)/h;
    if (mouse_button == Qt::LeftButton)
    {
        foreach (int key, keys) {
            switch (key) {
            case Qt::Key_Control:
                m_camera.rotateY(-d_x*180*5);
                m_camera.rotateX(-d_y*180*5);
                break;
            case Qt::Key_Shift:
                m_camera.move(5*d_x, 5*d_y, 0);
                break;
            default:
                break;
            }
        }
    }
    mouse_pos_x_old = x;
    mouse_pos_y_old = y;
    this->repaint();
}

void glwidget::mouseReleaseEvent(QMouseEvent *event){  //鼠標(biāo)左鍵松開禁止改變相機(jī)視角
    changeview_ = false;
}

void glwidget::wheelEvent(QWheelEvent *event){
    if (event->delta() > 0)
        fov-=2.0f;
    else
        fov+=2.0f;
    if (fov<0.50f)
        fov = 0.5f;
    if (fov>=200.f)
        fov = 200.0;
    this->repaint();
}

void glwidget::keyReleaseEvent(QKeyEvent *event)
{
    if(!event->isAutoRepeat())  //判斷如果不是長(zhǎng)按時(shí)自動(dòng)觸發(fā)的釋放,就將key值從容器中刪除
        keys.removeAll(event->key());
    if(keys.isEmpty()) //容器空了,關(guān)閉定時(shí)器
        keyRespondTimer->stop();
}

void glwidget::keyPressEvent(QKeyEvent *event)
{
    if(!event->isAutoRepeat())  //判斷如果不是長(zhǎng)按時(shí)自動(dòng)觸發(fā)的按下,就將key值加入容器
        keys.append(event->key());
    if(!keyRespondTimer->isActive()) //如果定時(shí)器不在運(yùn)行,就啟動(dòng)一下
        keyRespondTimer->start(4);
}

void glwidget::slotTimeOut(){
    foreach (int key, keys) {
        switch (key) {
        case Qt::Key_D:
            break;
        case Qt::Key_Shift:
            modifier_key = Qt::Key_Shift;
            break;
        default:
            break;
        }
    }
}

鼠標(biāo)交互功能

??交互的功能實(shí)現(xiàn)是重載QOpenGLWidget的鼠標(biāo)事件函數(shù),修改相應(yīng)的矩陣,也就對(duì)應(yīng)最上面的相機(jī)變化、燈光變化等;

obj格式介紹

??OBJ文件(.obj)包含有關(guān)3D對(duì)象的幾何體的信息,下面是一個(gè)長(zhǎng)方體的obj格式文件;

#
# Object file
#
mtllib Cube3x3x10.mtl
# Cube3x3x10\實(shí)體
v 0 0 0
v 3.00000002607703 0 0
v 3.00000002607703 0 9.99999977648258
v 0 0 9.99999977648258
v 3.00000002607703 3.00000002607703 9.99999977648258
v 0 3.00000002607703 9.99999977648258
v 0 0 9.99999977648258
v 3.00000002607703 0 9.99999977648258
v 0 3.00000002607703 9.99999977648258
v 0 3.00000002607703 0
v 0 0 0
v 0 0 9.99999977648258
v 0 3.00000002607703 0
v 3.00000002607703 3.00000002607703 0
v 3.00000002607703 0 0
v 0 0 0
v 3.00000002607703 3.00000002607703 0
v 3.00000002607703 3.00000002607703 9.99999977648258
v 3.00000002607703 0 9.99999977648258
v 3.00000002607703 0 0
v 3.00000002607703 3.00000002607703 9.99999977648258
v 3.00000002607703 3.00000002607703 0
v 0 3.00000002607703 0
v 0 3.00000002607703 9.99999977648258
vn 0 -1 0
vn 0 -1 0
vn 0 -1 0
vn 0 -1 0
vn 0 0 1
vn 0 0 1
vn 0 0 1
vn 0 0 1
vn -1 0 0
vn -1 0 0
vn -1 0 0
vn -1 0 0
vn 0 0 -1
vn 0 0 -1
vn 0 0 -1
vn 0 0 -1
vn 1 0 0
vn 1 0 0
vn 1 0 0
vn 1 0 0
vn 0 1 0
vn 0 1 0
vn 0 1 0
vn 0 1 0
vt 0 0
vt 0 0.00300000002607703
vt 0.00999999977648258 0.00300000002607703
vt 0.00999999977648258 0
vt 0.00150000001303852 0.00300000002607703
vt -0.00150000001303852 0.00300000002607703
vt -0.00150000001303852 0
vt 0.00150000001303852 0
vt 0.00499999988824129 0.00300000002607703
vt -0.00499999988824129 0.00300000002607703
vt -0.00499999988824129 0
vt 0.00499999988824129 0
vt 0.00150000001303852 0.00300000002607703
vt -0.00150000001303852 0.00300000002607703
vt -0.00150000001303852 0
vt 0.00150000001303852 0
vt 0.00499999988824129 0.00300000002607703
vt -0.00499999988824129 0.00300000002607703
vt -0.00499999988824129 0
vt 0.00499999988824129 0
vt 0.00999999977648258 0.00300000002607703
vt 0 0.00300000002607703
vt 0 0
vt 0.00999999977648258 0
o Cube3x3x10\實(shí)體
s off
# face 0
f 2/2/2 3/3/3 1/1/1
f 1/1/1 3/3/3 4/4/4
# face 1
f 5/5/5 6/6/6 8/8/8
f 8/8/8 6/6/6 7/7/7
# face 2
f 9/9/9 10/10/10 12/12/12
f 12/12/12 10/10/10 11/11/11
# face 3
f 13/13/13 14/14/14 16/16/16
f 16/16/16 14/14/14 15/15/15
# face 4
f 17/17/17 18/18/18 20/20/20
f 20/20/20 18/18/18 19/19/19
# face 5
f 21/21/21 22/22/22 24/24/24
f 24/24/24 22/22/22 23/23/23

??其中

  • mtllib Cube3x3x10.mtl ??表示引用的材質(zhì)文件的文件名
  • v 0 0 0 ?????????表示一個(gè)點(diǎn)的xyz坐標(biāo),使用空格隔開
  • vn 0 -1 0????????表示一個(gè)點(diǎn)的法向量,使用空格隔開
  • vt 0.09 0????????表示uv紋理坐標(biāo),使用空格隔開
  • f 2/2/2 3/3/3 1/1/1????表示一個(gè)面, 2/2/2依次為頂點(diǎn)索引,紋理坐標(biāo)索引,法向索引,因?yàn)槭侨敲嫫?,所以是三組,也有超多三個(gè)點(diǎn)的,自己造輪子的時(shí)候要注意
  • o Cube??????表示指定了模型名稱為Cube
  • s off ??????表示關(guān)閉光滑組

void ObjLoader::load(QString filename)
{
    // 打開文件
    QFile file(filename);
    if(!file.open(QIODevice::ReadOnly)){
        qDebug()<<"[Error] fail to open file: "<< filename;
        return;
    }
    // 讀取文件
    QTextStream ts(&file);
    // 臨時(shí)存儲(chǔ)
    QVector<QVector3D> v;
    QVector<QVector3D> vn;
    QVector<QVector3D> vt;
    QVector<QStringList> str_faces;
    QVector<Face> faces;
    while(!ts.atEnd()){
        QStringList list = ts.readLine().split(QRegExp("(\\s+)"));
        list.removeAll(" ");
        if(list.size() == 0 )
            break;
        if(list[0] == "v")
            v.push_back(QVector3D(list[1].toFloat(),list[2].toFloat(),list[3].toFloat()));
        if(list[0] == "vn")
            vn.push_back(QVector3D(list[1].toFloat(),list[2].toFloat(),list[3].toFloat()));
        if(list[0] == "vt")
            vt.push_back(QVector3D(list[1].toFloat(),list[2].toFloat(),0));
        if(list[0] == "f")
            str_faces.push_back(list);
    }

    for( int i =0; i< str_faces.size(); i++)
    {
        Face face;
        for( int j = 1; j<=3; j++)  //obj中頂點(diǎn)索引是從1開始
        {
            QStringList list = str_faces[i][j].split("/");
            face.v[j-1] = list[0].toInt() -1;
            face.t[j-1] = list[1].toInt() -1;
            face.n[j-1] = list[2].toInt() -1;
        }
        faces.push_back(face);
    }

    for( int i = 0; i<faces.size();i++)
    {
        QVector3D a,b,c,na,nb,nc;
        a = v[faces[i].v[0]];
        b = v[faces[i].v[1]];
        c = v[faces[i].v[2]];
        na = vn[faces[i].n[0]];
        nb = vn[faces[i].n[1]];
        nc = vn[faces[i].n[2]];

        mv.push_back(a.x());
        mv.push_back(a.y());
        mv.push_back(a.z());
        mv.push_back(b.x());
        mv.push_back(b.y());
        mv.push_back(b.z());
        mv.push_back(c.x());
        mv.push_back(c.y());
        mv.push_back(c.z());
        
        mn.push_back(na.x());
        mn.push_back(na.y());
        mn.push_back(na.z());
        mn.push_back(nb.x());
        mn.push_back(nb.y());
        mn.push_back(nb.z());
        mn.push_back(nc.x());
        mn.push_back(nc.y());
        mn.push_back(nc.z());
    }
    file.close();
    std::cout<< filename.toStdString() <<" id succeded!\t model_size:"<<mv.size()/3<<std::endl;
}

效果

?暫時(shí)還不會(huì)弄視頻或者動(dòng)態(tài)圖,先看個(gè)靜態(tài)效果吧

bunny

qt的opengl導(dǎo)入模型,QT/OpenGL,qt,計(jì)算機(jī)外設(shè),交互

Cayman_GT

qt的opengl導(dǎo)入模型,QT/OpenGL,qt,計(jì)算機(jī)外設(shè),交互文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-761676.html

到了這里,關(guān)于基于QT使用OpenGL,加載obj模型,進(jìn)行鼠標(biāo)交互的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 如何使用 ThreeJs 以 glTF、FBX 和 OBJ 文件格式加載 3D 模型,使用 ThreeJS 加載和顯示帶有紋理的 3D 模型

    在本文中,我展示了如何使用 ThreeJS 在 Web 視圖中加載 3D 模型。Three.js 是一個(gè)跨瀏覽器的 JavaScript 庫(kù)和應(yīng)用程序編程接口,用于使用 WebGL 在 Web 瀏覽器中創(chuàng)建和顯示動(dòng)畫 3D 計(jì)算機(jī)圖形。加載不完整的原因有很多,例如紋理和材質(zhì)渲染不正確。 創(chuàng)建場(chǎng)景 渲染場(chǎng)景 動(dòng)畫立方體

    2023年04月08日
    瀏覽(32)
  • 使用Open3D進(jìn)行OBJ模型三維可視化

    使用Open3D進(jìn)行OBJ模型三維可視化 在三維圖像處理領(lǐng)域,OBJ文件是一種常見的三維模型格式,而Open3D則是一個(gè)強(qiáng)大的開源3D計(jì)算機(jī)視覺庫(kù)。本文將介紹如何使用Open3D對(duì)OBJ文件進(jìn)行可視化。 首先,需要安裝Open3D庫(kù)。使用pip install即可: 接下來(lái),我們可以使用Open3D提供的read_triang

    2024年02月06日
    瀏覽(50)
  • Qt使用OpenGL進(jìn)行多線程離屏渲染

    Qt使用OpenGL進(jìn)行多線程離屏渲染

    基于Qt Widgets的Qt程序,控件的刷新默認(rèn)狀況下都是在UI線程中依次進(jìn)行的,換言之,各個(gè)控件的QWidget::paintEvent方法會(huì)在UI線程中串行地被調(diào)用。若是某個(gè)控件的paintEvent很是耗時(shí)(等待數(shù)據(jù)時(shí)間+CPU處理時(shí)間+GPU渲染時(shí)間),會(huì)致使刷新幀率降低,界面的響應(yīng)速度變慢。 假如這個(gè)

    2024年02月02日
    瀏覽(20)
  • 計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)四 OpenGL的鼠標(biāo)交互繪制

    一、實(shí)驗(yàn)?zāi)康?1.掌握OpenGL的鼠標(biāo)按鈕響應(yīng)函數(shù)。 2.掌握OpenGL的鼠標(biāo)移動(dòng)響應(yīng)函數(shù)。 3.進(jìn)一步鞏固OpenGL的基本圖元繪制基礎(chǔ)。 二、實(shí)驗(yàn)內(nèi)容 1.鼠標(biāo)畫草圖——實(shí)現(xiàn)鼠標(biāo)點(diǎn)到哪,線就畫到哪。 思路: 1)在主程序注冊(cè)鼠標(biāo)響應(yīng)和鼠標(biāo)移動(dòng)子函數(shù): glutMouseFunc(mymouse); glutMotionFunc(mym

    2023年04月20日
    瀏覽(104)
  • threejs加載.Fbx .OBJ 3D模型文件

    threejs加載.Fbx .OBJ 3D模型文件

    在threejs官網(wǎng)下載threejs的文件,可以選擇直接下載,也可以跳轉(zhuǎn)到GitHub拉取 拉取下來(lái)的完整文件就是這個(gè)樣子 拉取成功后我們?cè)诒镜匕惭b啟動(dòng)服務(wù),這樣就能很快速的查看threejs的各種例子了 可以先看看官網(wǎng)里的例子,你想要的東西官方里面都有 后期在開發(fā)的時(shí)候需要用到b

    2023年04月08日
    瀏覽(29)
  • 【[Qt]基于QChartView開發(fā)的圖表顯示控件,支持實(shí)時(shí)顯示,動(dòng)態(tài)更新,支持鼠標(biāo)交互等操作】

    【[Qt]基于QChartView開發(fā)的圖表顯示控件,支持實(shí)時(shí)顯示,動(dòng)態(tài)更新,支持鼠標(biāo)交互等操作】

    十字線和顯示坐標(biāo)實(shí)現(xiàn) 在.h文件中定義十字線lineitem變量和坐標(biāo)textitem變量 在Cpp文件中初始化 然后定義鼠標(biāo)事件,在鼠標(biāo)進(jìn)入時(shí)顯示,移出時(shí)隱藏,移動(dòng)時(shí)顯示。 其他實(shí)現(xiàn)請(qǐng)參考具體代碼 ChartDrawer.h文件 ChartDrawer.cpp 文件 具體使用代碼如下 1、初始化類對(duì)象,并加入界面布局

    2023年04月23日
    瀏覽(30)
  • 【計(jì)算機(jī)圖形學(xué) 】掃描線多邊形填充算法 | OpenGL+鼠標(biāo)交互

    【計(jì)算機(jī)圖形學(xué) 】掃描線多邊形填充算法 | OpenGL+鼠標(biāo)交互

    傳送門 實(shí)現(xiàn)多邊形掃描線填充算法,并和鼠標(biāo)進(jìn)行交互。 具體原理略過(guò),會(huì)貼上完整代碼,可直接運(yùn)行。 環(huán)境: vs2019,OpenGL的庫(kù)(可以搜索如何用vs使用OpenGL的庫(kù),可以使用vs自帶的插件或者其他方法,很方便) 要點(diǎn): 1.NET和AET的創(chuàng)建,改動(dòng) 2.改變鼠標(biāo)點(diǎn)擊和鼠標(biāo)拖拽的響應(yīng)

    2023年04月08日
    瀏覽(100)
  • Unity運(yùn)行時(shí)程序動(dòng)態(tài)加載外部.fbx.obj模型文件

    Unity運(yùn)行時(shí)程序動(dòng)態(tài)加載外部.fbx.obj模型文件

    項(xiàng)目中有用到這個(gè)需求,為實(shí)現(xiàn)Unity程序運(yùn)行狀態(tài)下,從程序外部動(dòng)態(tài)加載fbx或obj模型,所以研究了一下,目前TriLib比較靠譜,好用,多平臺(tái)適用。會(huì)提供 下載插件地址。 unity運(yùn)行時(shí)加載fbx 使用的插件 下載插件地址 將Trilib壓縮包內(nèi)容解壓到Unity工程Assets文件夾下,返回工程等

    2024年02月16日
    瀏覽(28)
  • Three.js加載外部glb,fbx,gltf,obj 模型文件

    Three.js加載外部glb,fbx,gltf,obj 模型文件

    vue3使用Three.js加載外部模型文件 1.安裝Three.js 2.新建一個(gè)renderModel.js 用于處理Three.js相關(guān)邏輯 3.modelPage.vue 中使用頁(yè)面 6.效果圖:

    2024年02月15日
    瀏覽(30)
  • c++ QT opengl鼠標(biāo)控制平移、縮放、繞點(diǎn)旋轉(zhuǎn)

    c++ QT opengl鼠標(biāo)控制平移、縮放、繞點(diǎn)旋轉(zhuǎn)

    坐標(biāo)系固定在左下角 坐標(biāo)系和正方形 一起旋轉(zhuǎn),但不平移與縮放 鼠標(biāo)左鍵平移正方形,右鍵旋轉(zhuǎn),滾輪縮放(放大與縮小) 編寫繪制正方形與坐標(biāo)系函數(shù) 在OpenGL窗口界面繪制 實(shí)現(xiàn)鼠標(biāo)左鍵平移移動(dòng),右鍵旋轉(zhuǎn),滾輪縮放(放大與縮?。?設(shè)置正方形的旋轉(zhuǎn)點(diǎn) ,以及坐標(biāo)系

    2024年02月06日
    瀏覽(42)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包