C++ 法線の計算
Depthmapをもつ画像のピクセルごとに法線を計算する関数を作成したのですが、いまいち計算が遅いです。if文をできるだけ使わないようにしたり、自分なりに変更したのですが、どなたかアドバイスを頂けないでしょうか。
Visual Studio, windows7, C++ です。
Tvector3<float> calc_normal(Tvector3<float> p1, Tvector3<float> p2, Tvector3<float> p3){
Tvector3<float> v1;
Tvector3<float> v2;
Tvector3<float> cross;
float length;
Tvector3<float> n;
v1 = p1 - p2;
v2 = p3 - p2;
cross = v2.cross(v1);
/* 外積v2×v1の長さ|v2×v1|(= length)を求める */
cross.normalize();
/* 長さ|v2×v1|が0のときは法線ベクトルは求められない */
if (length == 0.0f) {
//cout<<"lenth=0"<<endl;
//break ();
}
/* 外積v2×v1を長さ|v2×v1|で割って法線ベクトルnを求める */
//cout<<cross<<endl;
return cross;
}
void calc_all_noraml(Ttexturef dmap, vector<Tvector3<float>> &n){
int w = dmap.getWidth();
int h = dmap.getHeight();
Tvector3<float> pc,pl,pr,pd,pu;
int j=0;
cout<<j<<endl;
for(int i=0; i<w; i++){
vector<Tvector3<float>> temp;
pc = Tvector3<float>(i,j,return_depth(dmap,i,j));
if(i-1 > 0)pl = Tvector3<float>(i-1,j,dmap.get(i-1,j).r);
if(i+1 < w)pr = Tvector3<float>(i+1,j,dmap.get(i+1,j).r);
pu = Tvector3<float>(i,j+1,dmap.get(i,j+1).r);
if(i-1 > 0)temp.push_back(calc_normal(pl,pu,pc));
if(i+1 < w)temp.push_back(calc_normal(pc,pu,pr));
Tvector3<float> sum(0,0,0);
for(int k=0; k<(int)temp.size(); k++){
sum += temp.at(k);
}
sum.normalize();
//cout<<sum<<endl;
n.push_back(sum);
}
for(j=1;j<(h-1);j++){
cout<<j<<endl;
int i=0;
vector<Tvector3<float>> temp;
pc = Tvector3<float>(i,j,return_depth(dmap,i,j));
pr = Tvector3<float>(i+1,j,return_depth(dmap,i+1,j));
pu = Tvector3<float>(i,j+1,return_depth(dmap,i,j+1));
pd = Tvector3<float>(i,j-1,return_depth(dmap,i,j-1));
temp.push_back(calc_normal(pc,pu,pr));
temp.push_back(calc_normal(pc,pr,pd));
Tvector3<float> sum(0,0,0);
for(int k=0; k<(int)temp.size(); k++){
sum += temp.at(k);
}
sum.normalize();
n.push_back(sum);
temp.clear();
for(int i=1; i<(w-1); i++){
Tvec
お礼
さっそくありがとうございます。 理解できました。