c++ - 没有构造函数 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");
解决方案
你有不同的选择。
我建议将模型构造函数修改为:
Model(string path ) {
this->loadModel( path );
}
因此,您将收到一个将传递给加载程序的字符串对象。
另一种选择是在对象声明中进行强制转换:
Model earthModel((GLChar*)"resources/models/earth/Earth.obj");
但我不喜欢它,因为可能与 GLchar 和 char 类型不匹配。
推荐阅读
- sql - 如何让 MSAccess SUM 基于 Field
- html - 在 html onclick 事件上实现错误处理的最佳方法
- deployment - Wonderware 无法部署访问被拒绝、无效凭证
- sas - 在 SAS 中将站点名称和编号序列分配给 patid
- android - Flutter - Android Studio 中的 iOS 构建失败
- mongodb - 如何将具有前导零值的字段的 CSV 文件导入 MongoDB?
- javascript - useEffect 没有得到正确的值
- json - 有没有办法在 colab 中从谷歌驱动器打开 kaggle json 文件?
- python-3.x - 在 Macbook 上安装 TA-Lib
- python - 如何更改问题解决格式以使用 lambda 和/或 map (Python)