Opengl 计算两条直线之间的三维角度上的点

Opengl 计算两条直线之间的三维角度上的点,opengl,math,vector,3d,angle,Opengl,Math,Vector,3d,Angle,我试图计算一个角度(圆段)上的多个点,以便将其存储为Vector3的VBO并在OpenGL中渲染 把虚线上的每个点想象成我要计算的坐标 我知道我可以用点积求出角度的大小,在二维空间中,我可以用这个角度的正弦和余弦来计算角度上的点。但我如何将其应用于三维空间 我想也许我应该把角度分成几个分量,但是我不确定在那种情况下如何计算大小 那么,计算这些点的最佳方法是什么?我该怎么做 我用的是C#但是当然伪代码或者仅仅是方法就可以了。诀窍是计算点,就像你的两个向量是单位向量一样。就半圆。但不是把它写成(x

我试图计算一个角度(圆段)上的多个点,以便将其存储为Vector3的VBO并在OpenGL中渲染

把虚线上的每个点想象成我要计算的坐标

我知道我可以用点积求出角度的大小,在二维空间中,我可以用这个角度的正弦和余弦来计算角度上的点。但我如何将其应用于三维空间

我想也许我应该把角度分成几个分量,但是我不确定在那种情况下如何计算大小

那么,计算这些点的最佳方法是什么?我该怎么做


我用的是C#但是当然伪代码或者仅仅是方法就可以了。

诀窍是计算点,就像你的两个向量是单位向量一样。就半圆。但不是把它写成(x,y)=(0,0,1)*x+(0,1,0)*y。。。只需输入两个红色和绿色向量作为新的基


计算二维x、y圆点。那么3d点就是红向量*x+绿向量*y

对两个向量进行规格化和缩放,然后在它们之间进行slerp

表示球面线性插值,主要用于四元数,但在此处也有效

vec3 slerp(vec3 a, vec3 b, float t){
    float dotp = dot(a,b);
    if (dotp > DOT_THRESHOLD) {
        // If the inputs are too close for comfort, linearly interpolate
        // and normalize the result to avoid division by near 0

        vec3 result = v0 + t*(v1 – v0);
        result.normalize();
        return result;
    }
    float theta = acos(dotp);
    return (sin(theta*(1-t))*a + sin(theta*t)*b)/sin(theta);
}

这是C++程序的C++ DLL(测试但角度不均匀,只要向量有一个量,就没有除法):

用法:

 [DllImport("angle.dll")]
        extern static void anglePoints(
                                                  float x1,
                                                  float y1,
                                                  float z1,
                                                  float x2,
                                                  float y2,
                                                  float z2,
                                                  float [] points
                                                  );
DLL的名称:

class float3
{
public:
    float x,y,z;
    float3(float X, float Y, float Z)
    {
        x=X; y=Y; z=Z;
    }

    float3 sub(float X, float Y, float Z)
    {
        float3 tmp(0,0,0);
        tmp.x=x-X;
        tmp.y=y-Y;
        tmp.z=z-Z;
        return tmp;
    }

    float3 sub(float3 b)
    {
        float3 tmp(0,0,0);
        tmp.x=x-b.x;
        tmp.y=y-b.y;
        tmp.z=z-b.z;
        return tmp;
    }

    float3 add(float3 b)
    {
        float3 tmp(0,0,0);
        tmp.x=x+b.x;
        tmp.y=y+b.y;
        tmp.z=z+b.z;
        return tmp;
    }

    void normalize()
    {
        float r=sqrt(x*x+y*y+z*z);
        x/=r;
        y/=r;
        z/=r;
    }

    void scale(float s)
    {
        x*=s;y*=s;z*=s;
    }

    void set(float3 v)
    {
        x=v.x;y=v.y;z=v.z;
    }

};


extern "C" __declspec(dllexport) void anglePoints(
                                                  float x1,
                                                  float y1,
                                                  float z1,
                                                  float x2,
                                                  float y2,
                                                  float z2,
                                                  float * points
                                                  )
{
    float3 A(x1,y1,z1);
    float3 B(x2,y2,z2);
    float3 tmp(0,0,0);
    float3 diff(0,0,0);

    for(int i=0;i<10;i++)
    {
        tmp.set(A);
        diff.set(B.sub(A));
        diff.scale(0.1*((float)i)); // simple and not efficient :P
        diff.set(diff.add(tmp));
        diff.normalize();           // normalized values so you can
        points[i*3+0]=diff.x;       // simply use them
        points[i*3+1]=diff.y;
        points[i*3+2]=diff.z;

    }

}

这个问题似乎离题了,因为它是关于数学的。t的合适值是多少?现在正在尝试该方法。它应该在0和1之间变化,以确定要添加到VBOI的点的数量。我已经尝试过,但没有得到任何结果-只需确认我计算了总角度,然后从0增加到角度,滑动两个方向向量以生成一个新点。@louisdeb例如,如果您想要30个点,则应将其称为:
newpoint=slerp(点1,点2,i/30f)
        float[] tmp = new float[30];
        anglePoints(0,1,1,10,10,10,tmp);
        for (int i = 0; i < 30; i++)
        {
            Console.WriteLine(tmp[i]);
        }
0              // starts as 0,1,1 normalized
0,7071068
0,7071068

0,34879
0,6627011
0,6627011

0,4508348
0,6311687
0,6311687

0,4973818
0,6134375
0,6134375

0,5237828
0,6023502
0,6023502

0,540738
0,5948119
0,5948119

0,5525321
0,5893675
0,5893675

0,5612046
0,5852562
0,5852562

0,5678473
0,5820435
0,5820435

0,5730973    //ends as 10,10,10 but normalized
0,579465
0,579465