首页 > 解决方案 > 没有构造函数 Model::Model 的实例与参数列表匹配

问题描述

当我想编译我的程序时,我收到了这个错误。该程序最初是用 xcode 编写的,并且运行良好。我不确定这是否与我试图在 Windows 上的 Visual C++ 上编译有关。这是标题,这是我在 cpp 文件 model.h 中得到错误的地方:

#pragma once

#include <string>
#include <fstream>
#include <sstream>
#include <iostream>
#include <map>
#include <vector>

#include <GL/glew.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include "../SOIL2/SOIL2.h"
#include <assimp/Importer.hpp>
#include <assimp/scene.h>
#include <assimp/postprocess.h>

#include "mesh.h"

using namespace std;

GLint TextureFromFile( const char *path, string directory );

class Model {
public:
    Model( GLchar *path ) {
        this->loadModel( path );
    }

    void Draw( Shader shader ) {
        for ( GLuint i = 0; i < this->meshes.size( ); i++ ) {
            this->meshes[i].Draw( shader );
        }
    }

private:
    vector<Mesh> meshes;
    string directory;
    vector<Texture> textures_loaded;

    void loadModel( string path ) {

        Assimp::Importer importer;
        const aiScene *scene = importer.ReadFile( path, aiProcess_Triangulate | aiProcess_FlipUVs );

        if( !scene || scene->mFlags == AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode ) {
            cout << "ERROR::ASSIMP:: " << importer.GetErrorString( ) << endl;
            return;
        }

        this->directory = path.substr( 0, path.find_last_of( '/' ) );
        this->processNode( scene->mRootNode, scene );
    }

    void processNode( aiNode* node, const aiScene* scene ) {
        for ( GLuint i = 0; i < node->mNumMeshes; i++ ) {
            aiMesh* mesh = scene->mMeshes[node->mMeshes[i]];
            this->meshes.push_back( this->processMesh( mesh, scene ) );
        }

        for ( GLuint i = 0; i < node->mNumChildren; i++ ) {
            this->processNode( node->mChildren[i], scene );
        }
    }

    Mesh processMesh( aiMesh *mesh, const aiScene *scene ) {
        vector<Vertex> vertices;
        vector<GLuint> indices;
        vector<Texture> textures;

        for ( GLuint i = 0; i < mesh->mNumVertices; i++ ) {
            Vertex vertex;
            glm::vec3 vector;

            vector.x = mesh->mVertices[i].x;
            vector.y = mesh->mVertices[i].y;
            vector.z = mesh->mVertices[i].z;
            vertex.Position = vector;

            vector.x = mesh->mNormals[i].x;
            vector.y = mesh->mNormals[i].y;
            vector.z = mesh->mNormals[i].z;
            vertex.Normal = vector;

            if( mesh->mTextureCoords[0] ) {
                glm::vec2 vec;
                vec.x = mesh->mTextureCoords[0][i].x;
                vec.y = mesh->mTextureCoords[0][i].y;
                vertex.TexCoords = vec;
            } else {
                vertex.TexCoords = glm::vec2( 0.0f, 0.0f );
            }

            vertices.push_back( vertex );
        }

        for ( GLuint i = 0; i < mesh->mNumFaces; i++ ) {
            aiFace face = mesh->mFaces[i];
            for ( GLuint j = 0; j < face.mNumIndices; j++ ) {
                indices.push_back( face.mIndices[j] );
            }
        }

        if( mesh->mMaterialIndex >= 0 ) {
            aiMaterial* material = scene->mMaterials[mesh->mMaterialIndex];
            vector<Texture> diffuseMaps = this->loadMaterialTextures( material, aiTextureType_DIFFUSE, "texture_diffuse" );
            textures.insert( textures.end( ), diffuseMaps.begin( ), diffuseMaps.end( ) );
            vector<Texture> specularMaps = this->loadMaterialTextures( material, aiTextureType_SPECULAR, "texture_specular" );
            textures.insert( textures.end( ), specularMaps.begin( ), specularMaps.end( ) );
        }
        return Mesh( vertices, indices, textures );
    }
    vector<Texture> loadMaterialTextures( aiMaterial *mat, aiTextureType type, string typeName ) {
        vector<Texture> textures;
        for ( GLuint i = 0; i < mat->GetTextureCount( type ); i++ ) {
            aiString str;
            mat->GetTexture( type, i, &str );
            GLboolean skip = false;

            for ( GLuint j = 0; j < textures_loaded.size( ); j++ ) {
                if( textures_loaded[j].path == str ) {
                    textures.push_back( textures_loaded[j] );
                    skip = true;

                    break;
                }
            }

            if( !skip ) {
                Texture texture;
                texture.id = TextureFromFile( str.C_Str( ), this->directory );
                texture.type = typeName;
                texture.path = str;
                textures.push_back( texture );

                this->textures_loaded.push_back( texture );
            }
        }

        return textures;
    }
};

GLint TextureFromFile( const char *path, string directory ) {
    string filename = string( path );
    filename = directory + '/' + filename;
    GLuint textureID;
    glGenTextures( 1, &textureID );

    int width, height;

    unsigned char *image = SOIL_load_image( filename.c_str( ), &width, &height, 0, SOIL_LOAD_RGB );

    glBindTexture( GL_TEXTURE_2D, textureID );
    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image );
    glGenerateMipmap( GL_TEXTURE_2D );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glBindTexture( GL_TEXTURE_2D, 0 );
    SOIL_free_image_data( image );

    return textureID;
}

我在我的 cpp 文件中收到错误的行:

Model earthModel("resources/models/earth/Earth.obj");
Model space("resources/models/space/space.obj");
Model sunModel( "resources/models/sun/sun.obj" );
Model mercuryModel( "resources/models/mercury/mercury.obj" );
Model venusModel( "resources/models/venus/venus.obj" );
Model marsModel( "resources/models/mars/mars.obj" );
Model jupiterModel("resources/models/jupiter/jupiter.obj");
Model saturnModel("resources/models/saturn/13906_Saturn_v1_l3.obj");
Model uranusModel("resources/models/uranus/13907_Uranus_v2_l3.obj");
Model neptuneModel("resources/models/neptune/13908_Neptune_v2_l3.obj");

标签: c++

解决方案


你有不同的选择。

我建议将模型构造函数修改为:

Model(string path ) {
    this->loadModel( path );
}

因此,您将收到一个将传递给加载程序的字符串对象。

另一种选择是在对象声明中进行强制转换:

Model earthModel((GLChar*)"resources/models/earth/Earth.obj");

但我不喜欢它,因为可能与 GLchar 和 char 类型不匹配。


推荐阅读