0

私は自分が持っているスポットライトの方向に適切なベクトルを見つけようとしています(懐中電灯のようにしようとしています)。懐中電灯を目の前に持っているように、カメラが常に向いている方向と同じ方向を向いてほしい。ただし、正しい方向ベクトルが見つからないようです。

現時点では、カメラの前後の動きを追うような軽いものがありますが、回転角度はありません。また、実際のスポットは、私が望むように真正面ではなく、上を向いています。

個々のオブジェクトのすべての法線が機能していることを私は知っています。すでに一般照明だけをテストしました。

質問に関連するコードを投稿します。私のコード全体が本当に必要な場合は、そう言ってください。ライトコード:

float sco=20;         //  Spot cutoff angle
float Exp=0;          //  Spot exponent

float Ambient[]   = {0.01*ambient ,0.01*ambient ,0.01*ambient ,1.0};
float Diffuse[]   = {0.01*diffuse ,0.01*diffuse ,0.01*diffuse ,1.0};
float Specular[]  = {0.01*specular,0.01*specular,0.01*specular,1.0};
//  Light direction
float Position[]  = {Ox+3, 2, Oz,1};
float Direction[] = {Ox+lx, here, Oz+lz, 0};

glLightfv(GL_LIGHT0,GL_AMBIENT ,Ambient);
glLightfv(GL_LIGHT0,GL_DIFFUSE ,Diffuse);
glLightfv(GL_LIGHT0,GL_SPECULAR,Specular);
glLightfv(GL_LIGHT0,GL_POSITION,Position);

glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,Direction);
glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,sco);
glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,Exp);

カメラコード:

//  Camera Values
double Ox=0, Oz=0;
float Oy=1.0;
float angle = 0.0;
float lx=0.0,lz=-1.0;
float deltaAngle = 0.0;
float deltaMove = 0;
double here;

void computePos(float deltaMove) {
    Ox += deltaMove * lx * 0.1f;
    Oz += deltaMove * lz * 0.1f;
}
void computeDir(float deltaAngle) {
    angle += deltaAngle;
    lx = sin(angle);
    lz = -cos(angle);
}

void display() {
    here = 2.0f*Oy;
    if (deltaMove)
        computePos(deltaMove);
    if (deltaAngle)
        computeDir(deltaAngle);

    gluLookAt(Ox,2,Oz, Ox+lx, here, Oz+lz, 0,1,0);
}


void key(unsigned char ch,int x,int y) {
    //  Exit on ESC
    if (ch == 27)
        exit(0);
    // WASD controls
    else if (ch == 'a' || ch == 'A')
        deltaAngle = -0.01;
    else if (ch == 'd' || ch == 'D')
        deltaAngle = 0.01;

    else if (ch == 'w' || ch == 'W') {
        collidefront=collision(1);
        collidextra=collision(3);
        if (collideback == 2 && collidextra == 3) { deltaMove = 0; collideback = 0; }
        else if (collideback == 2) { deltaMove = 0.1; collidefront = 0;}
        else if (collidefront == 1) deltaMove = 0;
        else 
            deltaMove = 0.1; 
        }

    else if (ch == 's' || ch == 'S') {
        collideback=collision(2);
        if (collidefront == 1) { deltaMove = -0.3; collidefront = 0; }
        else if (collideback == 2) deltaMove = 0;
        else 
            deltaMove = -0.1; 
        }

    else if ((ch == 'e' || ch == 'E') && here < 4)
        Oy += 0.01;
    else if ((ch == 'c' || ch == 'C') && here > .5)
        Oy -= 0.01;

    Project(fov,asp,dim);
    glutPostRedisplay();
}

ご協力ありがとうございました。

4

1 に答える 1

1

を使用しているのでgluLookAt、中心と目を差し引いたベクトルを簡単に計算できます。

(...)
gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ);
(...)
spotlightVecX = centerX - eyeX;
spotlightVecY = centerY - eyeY;
spotlightVecZ = centerZ - eyeZ;

ベクトルを計算した後、正規化することができます。

それが役に立てば幸い。

于 2012-07-01T04:16:38.650 に答える