找回密码
 点一下
查看: 3190|回复: 2

计算空间某个点随着某平面旋转过后点的位置的函数。

[复制链接]
发表于 2011-4-1 15:33:41 | 显示全部楼层 |阅读模式
例如,平面上的椭圆形运动,在每次timer要移动单位的时候就是SetUnit的时候把单位的x,y,z和制定一个旋转点然后传入我这个函数后会得到新的xyz是经过计算点随平面旋转后的点的xyz,这样就可以把平面上做椭圆运动的单位的整个椭圆给“翻起来”,传入参数angle可以设置绕xyz旋转的角度大小。做了一个凤凰的椭圆运动技能演示,在里面可以通过输入x+,y+,z+等让椭圆面绕相应的轴做“翻转”,另外也可以创建各自立体椭圆形如上图。用的是相对坐标,旋转轴都是在选定的平面上而且跟随物体的。

test.w3x

28 KB, 下载次数: 22

 楼主| 发表于 2011-4-1 16:00:10 | 显示全部楼层
function SetGround takes real x0,real y0,real z0,real x,real y,real z,string dire,real angle returns nothing
    local real new_x
    local real new_y
    local real new_z
    local real angle_x
    local real angle_y
    local real angle_z_x
    local real angle_z_y
    set x=x-x0
    set y=y-y0
    set z=z-z0
    if dire=="x" then
        set angle_x=LoadReal(udg_HT,StringHash("SetGround"),StringHash("angle_x"))
        set new_y=y*Cos(-angle)-z*Sin(-angle)
        set new_z=y*Sin(-angle)+z*Cos(-angle)
        set new_x=x
        if angle_x!=0 then
            set x=new_x*Cos(angle_x)-new_z*Sin(angle_x)
            set z=new_x*Sin(angle_x)+new_z*Cos(angle_x)
            set new_x=x
            set new_z=z
        endif
        set angle_y=LoadReal(udg_HT,StringHash("SetGround"),StringHash("angle_y"))
        set angle_y=angle_y-angle
        set angle_z_x=LoadReal(udg_HT,StringHash("SetGround"),StringHash("angle_z_x"))
        set angle_z_x=angle_z_x-angle
        call SaveReal(udg_HT,StringHash("SetGround"),StringHash("angle_y"),angle_y)
        call SaveReal(udg_HT,StringHash("SetGround"),StringHash("angle_z_x"),angle_z_x)
    elseif dire=="y" then
        set angle_y=LoadReal(udg_HT,StringHash("SetGround"),StringHash("angle_y"))
        set new_x=x*Cos(angle)-z*Sin(angle)
        set new_z=x*Sin(angle)+z*Cos(angle)
        set new_y=y
        if angle_y!=0 then
            set y=new_y*Cos(angle_y)-new_z*Sin(angle_y)
            set z=new_y*Sin(angle_y)+new_z*Cos(angle_y)
            set new_y=y
            set new_z=z
        endif
        set angle_x=LoadReal(udg_HT,StringHash("SetGround"),StringHash("angle_x"))
        set angle_x=angle_x+angle
        set angle_z_y=LoadReal(udg_HT,StringHash("SetGround"),StringHash("angle_z_y"))
        set angle_z_y=angle_z_y+angle
        call SaveReal(udg_HT,StringHash("SetGround"),StringHash("angle_x"),angle_x)
        call SaveReal(udg_HT,StringHash("SetGround"),StringHash("angle_z_y"),angle_z_y)
    else
        set angle_z_y=LoadReal(udg_HT,StringHash("SetGround"),StringHash("angle_z_y"))//y旋转导致,规定是先旋x然后y,所以回复时候是先回复y然后x。
        set angle_z_x=LoadReal(udg_HT,StringHash("SetGround"),StringHash("angle_z_x"))//x旋转导致
        set new_x=x*Cos(-angle)-y*Sin(-angle)
        set new_y=x*Sin(-angle)+y*Cos(-angle)
        set new_z=z
        if angle_z_y!=0 then
            set x=new_x*Cos(angle_z_y)-new_z*Sin(angle_z_y)
            set z=new_x*Sin(angle_z_y)+new_z*Cos(angle_z_y)
            set new_x=x
            set new_z=z
            call DisplayTextToPlayer(Player(0),0,0,"fff")
        endif
        if angle_z_x!=0 then
            set y=new_y*Cos(angle_z_x)-new_z*Sin(angle_z_x)
            set z=new_y*Sin(angle_z_x)+new_z*Cos(angle_z_x)
            set new_y=y
            set new_z=z
        endif
    endif
    set new_x=new_x+x0
    set new_y=new_y+y0
    set new_z=new_z+z0
    call SaveReal(udg_HT,StringHash("SetGround"),StringHash("x"),new_x)
    call SaveReal(udg_HT,StringHash("SetGround"),StringHash("y"),new_y)
    call SaveReal(udg_HT,StringHash("SetGround"),StringHash("z"),new_z)
endfunction
回复

使用道具 举报

发表于 2011-4-4 10:10:33 | 显示全部楼层
[jass]
/* 空间坐标旋转 */
//ax,ay,az分别为沿x,y,z轴旋转角度,x,y,z为点的坐标
//i=0,1,2;分别返回旋转后的x,y,z坐标
function pianzhuan takes real ax,real ay,real az,real x,real y,real z,integer i returns real
local real pi=3.14159
set ax=ax/180*pi
set ay=ay/180*pi
set az=az/180*pi
if i==0 then
return x*(Cos(ay)*Cos(az)-Sin(ax)*Sin(ay)*Sin(az))-y*Cos(ax)*Sin(az)+z*(Sin(ay)*Cos(az)+Sin(ax)*Cos(ay)*Sin(az))
elseif i==1 then
return x*(Cos(ay)*Sin(az)+Sin(ax)*Sin(ay)*Cos(az))+y*Cos(ax)*Cos(az)+z*(Sin(ay)*Sin(az)-Sin(ax)*Cos(ay)*Sin(az))
elseif i==2 then
return x*(-Cos(ax)*Sin(ay))+y*Sin(ax)+z*Cos(ax)*Cos(ay)
endif
return 0.0
endfunction
[/jass]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-12-22 11:15 , Processed in 0.046106 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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