gpt4 book ai didi

c++ - 调用返回数组的函数时出现问题

转载 作者:行者123 更新时间:2023-11-28 06:02:15 25 4
gpt4 key购买 nike

我正在尝试使用 C++ 中的 GLUT 和 OpenGL 编写一个简单的动画。为此,我创建了三个函数:catSpline()、fillArray()fixedAngle()catSpline() 返回一个 GLfloat 值,fillArray() 是一个空函数,由一系列循环组成,这些循环使用 catSpline 生成的 GLfloat 值填充一系列数组,并且fixedAngle() 将返回一个 16 单元数组。下面是这三种方法的代码:

GLfloat * fixedAngle(GLfloat initialX, GLfloat initialY, GLfloat initialZ, GLfloat rotX, GLfloat rotY, GLfloat rotZ)

{
ArrayXXf z(4,4); //initializing the 4x4 rotation matrixes
ArrayXXf y(4,4);
ArrayXXf x(4,4);

x<<1, 0, 0, 0,
0, cos(rotX), -sin(rotX), 0,
0, sin(rotX), cos(rotX), 0,
0, 0, 0, 1;

y<<cos(rotY), 0, sin(rotY), 0,
0, 1, 0, 0,
-sin(rotY), 0, cos(rotY), 0,
0, 0, 0, 1;

z<< cos(rotZ), -sin(rotZ), 0, 0,
sin(rotZ), cos(rotZ), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1;



ArrayXXf fin(4,4);

fin = x * y * z;

fin(0,3) = initialX;
fin(1,3) = initialY;
fin(2,3) = initialZ;
//now we've moved the translational information into the final matrix
// std::cout << fin;

fin(3,3) = 1;

GLfloat * arr;
arr = (GLfloat *) malloc(16*sizeof(GLfloat));

arr[0] = fin(0,0);
arr[1] = fin(0,1);
arr[2] = fin(0,2);
arr[3] = fin(0,3);
arr[4] = fin(1,0);
arr[5] = fin(1,1);
arr[6] = fin(1,2);
arr[7] = fin(1,3);
arr[8] = fin(2,0);
arr[9] = fin(2,1);
arr[10] = fin(2,2);
arr[11] = fin(2,3);
arr[12] = fin(3,0);
arr[13] = fin(3,1);
arr[14] = fin(3,2);
arr[15] = fin(3,3);


return arr;

}

GLfloat catSpline(GLfloat x1, GLfloat x2, GLfloat x3, GLfloat x4, GLfloat t)
{
ArrayXXf M(4,4); //4x4 M matrix
ArrayXXf P(4,1); //matrix to hold keyframe x values

P(0,0) = x1;
P(1,0) = x2;
P(2,0) = x3;
P(3,0) = x4;
//keyframe x values

M(0,0) = -0.5;
M(0,1) = 2-(-0.5);
M(0,2) = -0.5-2;
M(0,3) = 0.5;

M(1,0) = 2*0.5;
M(1,1) = 0.5-3;
M(1,2) = 3-(2*0.5);
M(1,3) = -0.5;

M(2,0) = -0.5;
M(2,1) = 0;
M(2,2) = 0.5;
M(2,3) = 0;

M(3,0) = 0;
M(3,1) = 1;
M(3,2)=0;
M(3,3)=0;

ArrayXXf T(1,4);



T(0,0) = t*t*t; //you can't cube a float, but you can get the same result by doing this
T(0,1) = t*t;
T(0,2) = t;
T(0,3)=1;
//now the T matrix is filled
ArrayXXf TM(1,4);

TM(0,0) = (T(0,0) * M(0,0)) + (T(0,1) * M(1,0)) + (T(0,2) * M(2,0)) + (T(0,3) * M(0,3));
TM(0,1) = (T(0,0) * M(0,1)) + (T(0,1) * M(1,1)) + (T(0,2) * M(2,1)) + (T(0,3) * M(3,1));
TM(0,2) = (T(0,0) * M(0,2)) + (T(0,1) * M(1,2)) + (T(0,2) * M(2,2)) + (T(0,3) * M(3,2));
TM(0,3) = (T(0,0) * M(0,3)) + (T(0,1) * M(1,3)) + (T(0,2) * M(2,3)) + (T(0,3) * M(3,3));
//first multiply T amd M




GLfloat TMP;

TMP = (TM(0,0) * P(0,0)) + (TM(0,1) *P(1,0)) + (TM(0,2) * P(2,0)) + (TM(0,3) * P(3,0));



return TMP;
}


void fillArrays()
{


/* zRot = catSpline(2, 4, 5, 6);
yRot = catSpline(1, 4, 6, 7);
xRot = catSpline(6, 3, 2, 6);

xArr = catSpline(9, 4, 3, 10);
yArr = catSpline(1, 2, 4, 8);
zArr = catSpline(8, 3, 1, 3);*/

for(int j=0; j>=100; j++)
{
xArr[j] = catSpline(2, 4, 5, 6, t);
t+=0.1;
}
for(int i=0; i>=100; i++)
{
yArr[i] = catSpline(2, 4, 5, 6, ty);
ty+=0.1;
}
for(int k=0; k>=100; k++)
{
xArr[k] = catSpline(2, 4, 5, 6, tz);
tz += 0.1;
}

for(int a=0; a>=100; a++)
{
xRot[a] = catSpline(2, 4, 5, 6, rx);
rx += 0.1;
}

for(int b=0; b>=100; b++)
{
yRot[b] = catSpline(2, 4, 5, 6, ry);
rz += 0.1;
}

for(int c=0; c>=100; c++)
{
zRot[c] = catSpline(2, 4, 5, 6, rz);
rz += 0.1;
}


}

我使用这三个函数的方式是在一个名为 Render 的循环中,我设置了 OpenGL 来显示茶壶模型的动画,调用 fillArrays(),然后尝试存储结果一个名为 foo 的新数组中的单个 fixedAngle 调用(使用之前填写的数组中的一些条目)。这似乎是错误的原因,foo 只包含一个指针地址而不是指向实际数组,所以我可以使用它。这是我用来调用这些函数的代码:

fillArrays();

GLfloat * foo;
foo = (GLfloat *) malloc(16*sizeof(GLfloat));

foo = fixedAngle(xArr[tp], yArr[tp], zArr[tp], xRot[tp], yRot[tp], zRot[tp]);

glLoadMatrixf(foo);

在使用多个 print 语句打印出函数的结果后,我知道问题出在我如何在某处设置指针。谁能帮我正确返回数组?

请注意:如果某些矩阵语法看起来不熟悉,那是因为我正在使用名为 Eigen 的 C++ 库来执行一些矩阵数学运算。再一次,在严格打印出函数的结果之后,我知道使用 Eigen 语法的函数正在生成正确的值。

最佳答案

你可以替换...

GLfloat * arr;
arr = (GLfloat *) malloc(16*sizeof(GLfloat));

...与...

std::vector<GLfloat> arr(16);

...甚至直接初始化它而不是之后复制元素...

std::vector<GLfloat> arr { fin(0,0), fin(0,1), fin(0,2), fin(0,3),
fin(1,0), fin(1,1), fin(1,2), fin(1,3),
fin(2,0), fin(2,1), fin(2,2), fin(2,3),
fin(3,0), fin(3,1), fin(3,2), fin(3,3) };

...哪个 - FWIW - 也可以这样做...

std::vector<GLfloat> arr;
for (int a = 0; a <= 3; ++a)
for (int b = 0; b <= 3; ++b)
arr.push_back(fin(a,b));

对于上述任何一项,您都需要相应地更改返回类型...

std::vector<GLfloat> fixedAngle(
GLfloat initialX, GLfloat initialY, GLfloat initialZ,
GLfloat rotX, GLfloat rotY, GLfloat rotZ)
{
...

...然后您可以调用 fixedAngle 并像这样使用 foo:

fillArrays();
std::vector<GLfloat> foo = fixedAngle(xArr[tp], yArr[tp], zArr[tp],
xRot[tp], yRot[tp], zRot[tp]);
glLoadMatrixf(foo.data()); // or `&foo[0]` if you prefer...

关于c++ - 调用返回数组的函数时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33028747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com