0

これは範囲の問題だと思います。ポインターまたは実際の構造体 (GLface または GLpoint) を渡そうとすると、宣言されていない識別子エラーが発生します。

ただし、両方の構造体は .h ファイルで明確に定義されています。

NormalCalculator.h

#pragma once
#include <vector>
#include <GL/glut.h>


class NormalCalculator
{

struct GLpoint
{
    GLfloat x,y,z;
};

struct GLface
{
    GLfloat x1,y1,z1,x2,y2,z2,x3,y3,z3;
};

public:
    NormalCalculator::NormalCalculator(void);
    NormalCalculator::~NormalCalculator(void);
    //put all of the face normal functions together 
    void NormalCalculator::generateFaceNormals(std::vector<GLfloat>* vertexArray, std::vector<GLubyte>* indexArray, std::vector<GLfloat>* normalArray);


private:
    //creates the line vectors from the the 3 points passed in as a part of the GLface
    void NormalCalculator::createLineVectorsFromFace(GLface facePassedIn, GLpoint* l_vec1, GLpoint* l_vec2); 
    //generates a normal vector for the 2 line vectors made by createLineVectorsFromFace
    void NormalCalculator::crossProductOfVecs(GLpoint* l_vec1, GLpoint* l_vec2, GLpoint* outPutNormal);
    //alters the normal vector so that it is of Unit length
    bool NormalCalculator::normalizeVector(GLpoint* normalVector, GLpoint* normalizedNormalVecContainer);
    GLpoint NormalCalculator::computeFaceNormal(GLface faceToNormal);
};

NormalCalculator.cpp は次のとおりです。

コンパイラによると、エラーは、GLface を関数 createLineVectorsFromFace に渡すところから始まります。そして、誰かが疑問に思っている場合に備えて、GLface がオブジェクトとして渡され、GLface へのポインターではないという事実は意図的なものです。

#include "NormalCalculator.h"
#include <gl/glut.h>
#include <math.h>
#include <iostream>





void createLineVectorsFromFace( GLface facePassedIn, GLpoint* l_vec1, GLpoint* l_vec2)
{
    //from verts 1 & 2 initialize l_vec1
    l_vec1->x = facePassedIn.x1 - facePassedIn.x2;
    l_vec1->y = facePassedIn.y1 - facePassedIn.y2;
    l_vec1->z = facePassedIn.z1 - facePassedIn.z2;
    //do that same for l_vec2 from face 2 and 3
    l_vec2->x = facePassedIn.x2 - facePassedIn.x3;
    l_vec2->y = facePassedIn.y2 - facePassedIn.y3;
    l_vec2->z = facePassedIn.z2 - facePassedIn.z3;
}


void crossProductOfVecs(GLpoint* l_vec1, GLpoint* l_vec2, GLpoint* outPutNormal)
{
    //cross product dat hoe
    outPutNormal->x = (l_vec1->y * l_vec2->z) - (l_vec1->z * l_vec2->y);//x = aybz-byaz
    outPutNormal->y = (l_vec1->z * l_vec2->x) - (l_vec1->x - l_vec2->z);//y = azbx-bzax
    outPutNormal->z = (l_vec1->x * l_vec2->y) - (l_vec1->y - l_vec2->x);//z = axby-bxay
}


bool NormalCalculator::normalizeVector(GLpoint* normalVector, GLpoint* normalizedNormalVecContainer)
{
    //first we must work out the magnitude of the normal vector
    GLfloat mag = (sqrt((float) pow(normalVector->x,2) + pow(normalVector->y,2) + pow(normalVector->z,2)));

    if(mag)
    {
        normalizedNormalVecContainer->x = normalVector->x/mag;
        normalizedNormalVecContainer->y = normalVector->y/mag;
        normalizedNormalVecContainer->z = normalVector->z/mag;
        return true;
    }

    else return false;

}

GLpoint NormalCalculator::computeFaceNormal(GLface faceToNormal)
{
    //first we create a couple of container GLpoints for our 2 line vectors
    GLpoint a;
    GLpoint b;
    createLineVectorsFromFace(faceToNormal, &a, &b);
    //Create a container for our origional normal
    GLpoint firstNorm;
    //We have our line vectors, and a container. Now cross product them and put them in the container.
    crossProductOfVecs(&a, &b, &firstNorm);
    //create out last normal container
    GLpoint finalNorm;
    //normalize it
    normalizeVector(&firstNorm, &finalNorm);

    return finalNorm;

}



NormalCalculator::NormalCalculator(void)
{
}

NormalCalculator::~NormalCalculator(void)
{
}

これは単なる推測ですが、typedef で何かをする必要がありますか?

4

1 に答える 1

3
void createLineVectorsFromFace( ....

と同じではありません

void NormalCalculator::createLineVectorsFromFace( ....

コンパイラは正しく (いつものように)、メンバを定義せず、自由な関数を定義しました。

についても同様ですcrossProductOfVecs

于 2012-10-26T18:08:45.327 に答える