游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3872|回复: 15

问个关于夹角的问题

[复制链接]

20

主题

465

帖子

472

积分

中级会员

Rank: 3Rank: 3

积分
472
QQ
发表于 2006-11-20 18:41:00 | 显示全部楼层 |阅读模式
对会一点数学的人应该很简单。我是在制作战棋游戏的人物攻击时遇到的这个问题,弓箭手射击的目标在自己周围的任何方向,然后我想确定它与目标之间的角度。虽然我的人物是3D的,但是这是个2D的问题。因为我有一个人物指向北方(上方)的方向,只要改变这个方向的偏航角,可以得到人物正确的方向。

所以这个问题是这样的,平面上有两个点,p0和p1,知道他们的x,y坐标,如何求出这两点间的直线和正北方(应该是Y轴)的夹角呢?这应该是一个很简单的问题吧?我的数学很差,希望各位帮忙解决一下,谢谢。

void AlphaObject::SetDirection(int x, int y)
{
        D3DXVECTOR3 look, up, right; // 物体的方向

        // 正北方
        look  = D3DXVECTOR3(0.0f,0.0f,1.0f);
        up    = D3DXVECTOR3(0.0f,1.0f,0.0f);
        right = D3DXVECTOR3(1.0f,0.0f,0.0f);

        // 请问在这里怎么求出自身坐标与目标坐标的弧度。
        float redain;

        D3DXMATRIX mat_yaw;
        // 围绕up向量旋转look和right向量(改变偏航角)
        D3DXMatrixRotationAxis(&mat_yaw, &up, redian);
        D3DXVec3TransformCoord(&look, &look, &mat_yaw);
        D3DXVec3TransformCoord(&right, &right, &mat_yaw);

        // 设置变换矩阵
        D3DXMatrixIdentity(&mat_trans);
        mat_trans._11 = right.x;
        mat_trans._12 = right.y;
        mat_trans._13 = right.z;
        mat_trans._21 = up.x;
        mat_trans._22 = up.y;
        mat_trans._23 = up.z;
        mat_trans._31 = look.x;
        mat_trans._32 = look.y;
        mat_trans._33 = look.z;
}

106

主题

743

帖子

745

积分

高级会员

Rank: 4

积分
745
QQ
发表于 2006-11-20 19:28:00 | 显示全部楼层

Re:问个关于夹角的问题

设:P0,P1,坐标为:P0(X0,Y0),P1(X1,Y1)。
则:直线P0P1与X轴的夹角的正切=(Y2-Y1)/(X2-X1)。
然后:根据正切值求出角度。(不知道有什么函数可以根据正切值求角度)
最后:与Y轴的夹角=90度 - 上面得到的角度。

20

主题

465

帖子

472

积分

中级会员

Rank: 3Rank: 3

积分
472
QQ
 楼主| 发表于 2006-11-20 19:35:00 | 显示全部楼层

Re:问个关于夹角的问题

最终需求的值是弧度。好像有个asin函数,但是我利用这个函数求出来的值不正确。或者是说我的源代码哪个地方有问题?
float sin_value = ((float)g_attack.target->m_y - (float)g_attack.unit->m_y) / ((float)g_attack.target->m_x - (float)g_attack.unit->m_x);
float redian = asin(sin_value);
g_attack.unit->m_obj.SetDirection(redian);

26

主题

178

帖子

237

积分

中级会员

Rank: 3Rank: 3

积分
237
发表于 2006-11-20 20:39:00 | 显示全部楼层

Re:问个关于夹角的问题

???龊稀⒂梅春?悼峙率俏ㄒ豢尚械霓k法 debug查看各??悼纯???出在何?

20

主题

465

帖子

472

积分

中级会员

Rank: 3Rank: 3

积分
472
QQ
 楼主| 发表于 2006-11-20 20:55:00 | 显示全部楼层

Re:问个关于夹角的问题

这个还有其它的方法吗?我觉得确定角度应该是一种经常使用的办法。
我现在的代码是这样的(设P0(x0,y0)、P1(x1,y1))。
float sin_value = (y1 - y0) / (x1 - x0);
float redian = asin(sin_value);

这样,redian得到的到底是一个什么样的弧度呢?我最终要得到的是面向正北方的单位需要旋转多少度才能面对着目标位置。恐怕还需要些特别的计算吧。

12

主题

217

帖子

220

积分

中级会员

Rank: 3Rank: 3

积分
220
发表于 2006-11-20 21:38:00 | 显示全部楼层

Re:问个关于夹角的问题

旋?矩?就是用sin 和 cos值,何苦算回去又算??

20

主题

465

帖子

472

积分

中级会员

Rank: 3Rank: 3

积分
472
QQ
 楼主| 发表于 2006-11-20 21:40:00 | 显示全部楼层

Re:问个关于夹角的问题

问题是我现在搞的不是旋转矩阵,而是物体的变换矩形。
里面不是用的sin或cos,而是用的look,up,right。

106

主题

743

帖子

745

积分

高级会员

Rank: 4

积分
745
QQ
发表于 2006-11-20 21:52:00 | 显示全部楼层

Re:问个关于夹角的问题

注意这里:正切=sin/cos。
float sin_value = (y1 - y0) / (x1 - x0);//这里是得到角度的正切
float redian = asin(sin_value);

20

主题

465

帖子

472

积分

中级会员

Rank: 3Rank: 3

积分
472
QQ
 楼主| 发表于 2006-11-20 21:57:00 | 显示全部楼层

Re:问个关于夹角的问题

具体的公式是怎样的?而且,这是个360度的圆,怎么求出最终需要的弧度来?

12

主题

217

帖子

220

积分

中级会员

Rank: 3Rank: 3

积分
220
发表于 2006-11-20 21:59:00 | 显示全部楼层

Re:问个关于夹角的问题

不好意思?]注意D3DXMatrixRotationAxis
不?你不用API自己填一??mat_yaw我想不到??惺颤N???
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 22:14

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表