找回密码
 点一下
查看: 5709|回复: 20

[求助]如何作出平滑的镜头移动?

[复制链接]
发表于 2007-11-3 12:49:22 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2007-11-3 15:28:18 | 显示全部楼层
线性代数..`我不及格
回复

使用道具 举报

发表于 2007-11-3 17:27:45 | 显示全部楼层
看看这样行吗,如果应用进入或切换已设置好的镜头,在一个时间循环内连续使用同一个镜头运用,而使用时间变化,可以达到加速或减速镜头切换的目的,比如:
[trigger]exectue
    事件
        玩家 - 玩家1(红色) 按下Esc键
    条件
    动作
        
        镜头 - 将 Camera 001 <预设> 应用方式设置为 应用 使用时间 10.00 秒
        等待 2.00 秒
        镜头 - 将 Camera 001 <预设> 应用方式设置为 应用 使用时间 3.00 秒
[/trigger]

如果是简单的移动镜头和设置镜头属性,按这种方法同样可以做到。

如果是复杂电影的需要专门配镜,有一个东西SetCinematicCamera,需要调用预设好的一个mdx镜头模型,当然war3 mpq 里带着一些常用的镜头模型比如移出,由于看不懂mdx,我也不知道该怎么设置。
回复

使用道具 举报

发表于 2007-11-3 17:47:21 | 显示全部楼层
或者自己计算镜头随时间的位置..
回复

使用道具 举报

发表于 2007-11-4 10:23:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2007-11-4 12:19:20 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-11-4 12:28:36 | 显示全部楼层
just a test

test.w3x

48 KB, 下载次数: 28

回复

使用道具 举报

发表于 2007-11-21 10:49:16 | 显示全部楼层
个人认为2楼的方法简单实用
回复

使用道具 举报

发表于 2007-11-21 12:21:19 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-12-1 20:56:33 | 显示全部楼层
逐渐加速很简单嘛。。。

Timer_EX结构
Timer t
real speed_X
real speed_Y
real X
real Y
cameraset C

然后。。。用Timer的0.01秒循环做加法就可以了。。

比如你想让speed_X以 0.2 的加速度递增,那么在函数里面写上0.01秒事件增加speed_X = speed_X + 0.2*0.01就可以了
回复

使用道具 举报

 楼主| 发表于 2007-12-2 18:15:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-12-2 20:23:12 | 显示全部楼层
还是建议采用自写函数啊~~
回复

使用道具 举报

 楼主| 发表于 2007-12-3 11:11:17 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-12-3 18:53:12 | 显示全部楼层
接受时间的某已经写过了
这里是接受初始速度和加速度的坐标计算
由于WE现在用不了,所以用C++写了
要用的话自己转成WE的,镜头参数的改变和其余的用接受时间的那个的就行
C++语法高亮居然用不了!

typedef struct
{
    float x;
    float y;
}posi;

bool caculate(posi start,posi obj,float speed,float a)
{
    posi dc;
    float t;
    float dgr;
    float dis;

    dgr = (float)atandgr( (obj.y - start.y) / (obj.x - start.x) );

    if(obj.x - start.x < 0)
        dgr += 180;

    cout<<"Degree = "<<dgr<<endl;

    dis = sqrt( (obj.y - start.y) * (obj.y - start.y) + (obj.x - start.x) * (obj.x - start.x) );

    cout<<"Distance = "<<dis<<endl;

    if(((2 * speed - a) * (2 * speed - a) + 8 * a * dis) < 0)
    {
        cout<<"Numberic Error"<<endl;
        return false;
    }

    t = (sqrt((2 * speed - a) * (2 * speed - a) + 8 * a * dis) - 2 * speed - a) / ( 2 * a );

    cout<<" Need move "<<t<<" times"<<endl;

    int te = 0;

    dc.x = start.x;
    dc.y = start.y;

    while(te<t)
    {
        cout<<"The "<<te<<"th move"<<endl;
        dc.x += (speed + te * a) * cosd(dgr);
        dc.y += (speed + te * a) * sind(dgr);

        cout<<"Current X "<<dc.x<<"   ";
        cout<<"Current Y "<<dc.y<<endl;

        ++te;
    }
    return true;
}

camerat.rar

12 KB, 下载次数: 16

回复

使用道具 举报

 楼主| 发表于 2007-12-4 13:08:23 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-12-5 12:24:57 | 显示全部楼层
其实可以兼顾速率和时间
后来一想把时间除以需要移动的次数就可以得到移动的间隔,拿这个开TIMER就行鸟
还要啥参数?
回复

使用道具 举报

发表于 2007-12-5 15:13:19 | 显示全部楼层
while(te<t)
    {
        cout<<"The "<<te<<"th move"<<endl;
        dc.x += (speed + te * a) * cosd(dgr);
        dc.y += (speed + te * a) * sind(dgr);

        cout<<"Current X "<<dc.x<<"  ";
        cout<<"Current Y "<<dc.y<<endl;

        ++te;
    }《-----这个就是Timer需要执行的内容。。8过目标pos,当前pos,计数器 i 要和timer绑定一下的说。。
回复

使用道具 举报

发表于 2007-12-5 15:21:31 | 显示全部楼层
又想还是开两个TIMER比较好
一个专门负责镜头参数的改变
一个专门负责PanCameraToLoc
如果指定的时间time / t(需要移动的次数) 比较大的话镜头参数变的时候可能会不太平滑
回复

使用道具 举报

发表于 2007-12-5 17:19:52 | 显示全部楼层
平滑的镜头移动?
war3默认就有函数啊-。-
回复

使用道具 举报

发表于 2007-12-5 18:28:22 | 显示全部楼层
war3那个不能做到加速减速之类的特殊镜头移动呀
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 13:55 , Processed in 0.085949 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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