我的仿射变换发生了一些奇怪的事情
Some odd things going on with my affine transforms
现在,我不是在问如何旋转我的对象,我要问的是为什么我的对象(SDL_Surface)在使用公式旋转时会拉伸:
x’=cos(角度)*x-sin(角度)*y;y’=sin(角度)*x+cos(角度)*y;
理论上(我认为)这是正确的。然而,当我使用下面的代码时,其中使用了这个公式,在角度超过15度后,我会得到奇怪的拉伸和翻转!知道是什么原因造成的吗?
for (int y = -GAME_HEIGHT/2; y < GAME_HEIGHT/2; ++y) {
for (int x = -GAME_WIDTH/2; x < GAME_WIDTH/2; ++x) {
/*----------------Begin Mode7 FX-----------------*/
float px, py, pz;
px = x;
py = FOV;
pz = y - Xrot;
float sx, sy;
sx = x;
sy = y;
//sx = px != 0 && pz != 0 ? px / pz : 0;
//sy = py != 0 && pz != 0 ? py / pz : 0;
sx = cos(Yrot*PI/180) * sx - sin(Yrot*PI/180) * sy;
sy = sin(Yrot*PI/180) * sx + cos(Yrot*PI/180) * sy;
sx *= scaling;
sy *= scaling;
sx = (sx / GAME_WIDTH * 0.5f + 0.5f) * BG0.image->w;
sy = (sy / GAME_HEIGHT * 0.5f + 0.5f) * BG0.image->h;
sx = (float)wrap((int)sx, 0, BG0.image->w);
sy = (float)wrap((int)sy, 0, BG0.image->h);
/*------------------End Mode7 FX-----------------*/
Uint32 grabPixel = getpixel(BG0.image, sx, sy);
SDL_PixelFormat* myPixelFormat=backBuffer->format;
putpixel(backBuffer, x+GAME_WIDTH/2, y+GAME_HEIGHT/2, grabPixel);
}
}
请帮忙,因为我一直用这个把头撞在桌子上。这是我正在做的获得完美软件渲染模式7效果的唯一绊脚石(这就是注释掉的透视变换的原因)
编辑:解决了这个问题,下面的答案解释了我是如何搞砸的。(基本上,我不小心在Y坐标生成中输入了错误的值,并且它使用了已经转换的X坐标)
当您执行sx=。。。然后你做sy=。。。,sy方程使用sx.
我认为你应该做这样的事情:
float ax = sx, ay = sy;
sx = cos(Yrot*PI/180) * ax - sin(Yrot*PI/180) * ay;
sy = sin(Yrot*PI/180) * ax + cos(Yrot*PI/180) * ay;
相关文章:
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 这C++代码中发生了什么C++(指数函数)
- 仿射密码解密,输出大小写不同
- 哪种方式更快?究竟发生了什么,我们没有看到什么?
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- 在特征中显示仿射变换
- c++问题:给一个变量赋值后,另一个变量发生了变化
- 从"LLONG_MAX 秒"构造 std::chrono::毫秒变量时发生了什么?
- 这个片段中关于 n 在 pc[i] 中的表示发生了什么
- istringstream,num1 和 num2 在这里发生了什么?
- 可视化:如何使用R&T向量仿射变换Point3D?
- 如何为仿射变换创建形状的OpenCV垫[3,2]
- 如何获得具有3x3矩阵的仿射变换
- 椭圆形斑块之间的仿射变换
- 我的仿射变换发生了一些奇怪的事情
- 结合两个仿射变换矩阵在OpenCV
- 如何连接仿射变换函数与事件从程序
- 仿射插值变换
- 使用dlib在图像上应用仿射变换
- 如何用平移、旋转和缩放来反转一个仿射变换