c++中遇到的标识符未定义的错误应该如何改正?
还有一个问题程序B obj(10,20,30);表示什么意思,obj是什么意思?有何用法?
你写的A 这个类,没有定义x这个成员变量呀,左边图里是有的,你仔细检查下
另外这个语句是用来定义并初始化B这个类的, 会调用 B类的 带三个参数的构造方法进行初始化
B obj(10,20,30);
我的方法是先将文件全部行遍历一遍,记录各种信息的总个数。由于,我想在这里将四边形处理为两个三角形,因此增加了一个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中的效果: