c++中遇到的标识符未定义的错误应该如何改正

c++中遇到的标识符未定义的错误应该如何改正?
还有一个问题程序B obj(10,20,30);表示什么意思,obj是什么意思?有何用法?

img

你写的A 这个类,没有定义x这个成员变量呀,左边图里是有的,你仔细检查下

另外这个语句是用来定义并初始化B这个类的, 会调用 B类的 带三个参数的构造方法进行初始化

B obj(102030);
  • 这篇博客: C++实现简单读取Obj格式文件中的 C++实现obj格式文件读取 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 我的方法是先将文件全部行遍历一遍,记录各种信息的总个数。由于,我想在这里将四边形处理为两个三角形,因此增加了一个iNum计数。事实上,DirectX会在曲面细分阶段更加高效的处理这些四边形。因此不必这么处理。

    while (getline(infile1, sline)) {//从指定文件逐行读取
    	if (sline[0] == 'v') {
    		if (sline[1] == 'n') {//vn
    			vnNum++;
    		}
    		else if (sline[1] == 't') {//vt
    			vtNum++;
    		}
    		else {//v
    			vNum++;
    		}
    	}
    	if (sline[0] == 'f') {
    		istringstream ins(sline);
    		s4.clear();
    		ins >> s0 >> s1 >> s2 >> s3 >> s4;
    		if (!s4.empty()) {
    			fNum++;
    			iNum++;
    		}
    		s4.clear();
    		fNum++;
    		iNum += 3;
    	}
    }
    infile1.close();
    

    完成计数后,再次进行一次遍历,储存所有顶点信息及索引信息。

    while (getline(infile2, sline)) {
    	if (sline[0] == 'v') {
    		if (sline[1] == 'n') {
    			istringstream ins(sline);
    			ins >> s0 >> normals[nn].x >> normals[nn].y >> normals[nn].z;
    			//cout << "normal:" << s0.c_str() << normals[nn].x << normals[nn].y << normals[nn].z << endl;
    			nn++;
    		}
    		else if (sline[1] == 't') {
    			istringstream ins(sline);
    			ins >> s0 >> uvs[tt].x >> uvs[tt].y >> uvs[tt].z;
    			uvs[tt].y = 1 - uvs[tt].y;
    			//cout << "uv:" << s0.c_str() << uvs[tt].x << uvs[tt].y << uvs[tt].z << endl;
    			tt++;
    		}
    		else {
    			istringstream ins(sline);
    			ins >> s0 >> positions[vv].x >> positions[vv].y >> positions[vv].z;
    			//cout << "pos:" << s0.c_str() << positions[vv].x << positions[vv].y << positions[vv].z << endl;
    			vv++;
    		}
    	}
    	if (sline[0] == 'f') {
    		istringstream in(sline);
    		float a;
    		in >> s0;//去掉f
    		UINT i, k;
    		for (i = 0; i < 4; i++) {
    			s0.clear();
    			in >> s0;
    			if (i == 3) {//第四项为空则跳过
    				if (s0.empty()) {//第四项存在则复制前两项然后读入本行第四项(四边形分为三角形)
    					b = false;
    					break;
    				}
    				else {
    					b = true;
    					indices[ii] = indices[ii - 3];
    					indices[ii+1] = indices[ii - 1];
    					ii += 2;
    				}
    			}
    
    			a = 0;
    			for (k = 0; s0[k] != '/'; k++)
    				a = a * 10 + (s0[k] - 48); //0在ASCII码中为48
    			vertices[ff].Pos = positions[a-1];
    			indices[ii] = ff;
    
    			a = 0;
    			for (k = k + 1; s0[k] != '/'; k++)
    				a = a * 10 + (s0[k] - 48);
    			vertices[ff].Tex0 = XMFLOAT4(uvs[a-1].x, uvs[a-1].y, uvs[a-1].z, 1.0f);
    
    			a = 0;
    			for (k = k + 1; s0[k]; k++)
    				a = a * 10 + (s0[k] - 48);
    			vertices[ff].Normal = normals[a-1];
    			ff++;
    			ii++;
    		}
    	}
    }
    

    同时,我在读取模型数据的时候又做一次计算切线的过程。CPU又一次抢走了GPU的活

    //计算切线【Q − P0 = (u − u0)T + (v − v0)B】
    FLOAT s1 = vertices[ff - 2].Tex0.x - vertices[ff - 3].Tex0.x;
    FLOAT s2 = vertices[ff - 1].Tex0.x - vertices[ff - 3].Tex0.x;
    FLOAT t1 = vertices[ff - 2].Tex0.y - vertices[ff - 3].Tex0.y;
    FLOAT t2 = vertices[ff - 1].Tex0.y - vertices[ff - 3].Tex0.y;
    FLOAT c = s1 * t2 - s2 * t1;
    XMFLOAT3 Q1 = minusFloat3(vertices[ff - 2].Pos, vertices[ff - 3].Pos);
    XMFLOAT3 Q2 = minusFloat3(vertices[ff - 1].Pos, vertices[ff - 3].Pos);
    XMFLOAT3 T = addFloat3(mul(t2 / c, Q1), mul(-t1 / c, Q2));
    //XMFLOAT3 B = addFloat3(mul(-s2 / c, Q1), mul(s1 / c, Q2));
    //float t = dot(T,B);
    XMFLOAT3 T1 = minusFloat3(T, mul(dot(T, vertices[ff - 1].Normal), vertices[ff - 1].Normal));
    XMFLOAT3 T2 = minusFloat3(T, mul(dot(T, vertices[ff - 2].Normal), vertices[ff - 2].Normal));
    XMFLOAT3 T3 = minusFloat3(T, mul(dot(T, vertices[ff - 3].Normal), vertices[ff - 3].Normal));
    
    normalized(T1);
    normalized(T2);
    normalized(T3);
    
    vertices[ff - 1].Tangent = T1;
    vertices[ff - 2].Tangent = T2;
    vertices[ff - 3].Tangent = T3;
    if (b == true) {
    	vertices[ff-4].Tangent = minusFloat3(T, mul(dot(T, vertices[ff - 4].Normal), vertices[ff - 4].Normal));
    	normalized(vertices[ff - 4].Tangent);
    	//vertices[ff-4].Normal = N;
    }
    

    读取后在DriectX12中的效果:
    在这里插入图片描述