怎样用c++做简单的动画

发布网友 发布时间:2022-04-22 06:56

我来回答

5个回答

热心网友 时间:2022-06-17 01:35

更改帧
准备好制作动画的纹理,
1.首先,需要一个公开的Texture[] 阵列,可以将纹理拖入到Unity编辑器中的对象,以及一个在Start()中初始化到0的整数currentTexturep。下一步需要一个像这样运行的NextTexture() 函数:
NextTexture(){
currentTexture++;
if(currentTexture>=textureArray.Length) currentTexture=0;
AnimatedPlane.renderer.material.mainTexture = textureArray[currentTexture];}
有两种简便的方法可以调用这种函数:协同程序递归和固定间隔。
使用固定间隔是最快的方法(但较不精确)。需要一个整数计数器,在Start()函数中初始化到0,以及一个FixedUpdate() 函数(游戏邦注:每次都会更新,可以在Unity时间管理器中自己调整)。
2.在FixedUpdate()中放置你的条件句(例如if(walking)),并在其中用conter++增加计时器,之后设置如下声明:
if(counter>=animationDelay){
counter=0;
NextTexture();
}
这里的animationDelay可以是自己选择的任意值。这将以持续速度(取决于你在Unity时间管理器中设置的速度)推进帧。
第二个方法是使用递归。但这一方法的劣势在于不易处理条件句,但还是能够获得所需要的准确延时。如果想让特定帧延长或缩短,这一方法就尤其管用。需要一个IEnumerator TextureChanger() 以及to StartCoroutine(TextureChanger()) in Start().
IEnumerator TextureChanger(){
yield return new WaitForSeconds(timeInterval);
if([conditions]) NextTexture();
}
这里timeInterval也是自己选择的任意值。有了这些函数,就可以将任意数量的纹理拖到GameObject,这样只要提供正确的条件,它就会正确运行动画。
descension(from gamasutra)
这是我即将发布的新游戏《Rotation Station》中的一个高级版本,是从一个较低点移到一个较高点,最后变成一个小泡。每个贴图都会根据该公司向下移动,但每个贴图都有随机的延时,随机的初始化旋转(也使用这一公式旋转至它所期望的方向)。
Bearo-Wing(from gamasutra)
首先,需要知道鼠标位于2D区域。为了找到它,要先将这个代码放置于滑动GameObject的FixedUpdate()函数中:
Vector3 MousePosition = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x,
Input.mousePosition.y, transform.position.z-Camera.main.transform.position.z));
这里使用了鼠标的X和Y轴位置,以及从摄像机到滑动GameObject的距离来确定鼠标的2D位置和3D坐标。现在要从这个环节的开端来调整该公式。所以,要记住Unity中的2D步骤。
transform.position += new Vector3((MousePosition.x-transform.position.x),
(MousePosition.y-transform.position.y),0)*slidespeed;
只要这两行代码就搞定了!至于GUI这类东西,可以在之后编写一个声明:
if(Mathf.Abs(finalvalue-currentvalue)
RudeBear(from gamasutra)
这种移动方式非常简单,转换时用正弦(sin),旋转时用余弦(cos)。
为了创造这种动画,要让波纹停止并在你松手和输入时继续,否则这种动作就会极端分散。
所以需要一个首要变量(即所谓的walkbob),只要对象还在移动,它就会在FixedUpdate中增加Time.deltaTime。之后就制作函数:
translation = maxHeight*Mathf.Sin(speed*walkbob);
rotation = maxRoll*Mathf.Cos(speed*walkbob/2);
3.然后将位置和旋转设为这些值(例如transform.position = new Vector3(transform.position.x,translation,transform.position.y))。
这可以处理类似那种动作,但是还有一种动画需要考虑更多因素,这就是我所谓的三角舞,它用于制作可爱角色随着音乐摇摆起舞,
Rude-Bear-Radio(from gamasutra)
打算移动游戏对象时,就要选取一个浮动的initialtime = Time.time,这样对象才能以正确的位置和方向开始,并且不会突然跳入动作。
下一步,我们就要想想三角函数的概念。
使用简谐运动,其形式如下:
Y是指当前值,A是振幅,f是频率,t是运行时间,phi是指阶段。首先,我们很容易确定振幅。它是我们希望对象所具有的最大化高度或旋转。
下一个就是运行时间和阶段。用(Time.time-initialtime)轻松取代t而一次性处搞定这两者。这会将φ降为0,所以最后只需要得到频率。将对象的位置设为该数值。此时你只是在调整高度:
transform.position = new Vector3(transform.position.x,maxheight*
Mathf.Sin(2*Mathf.PI*frequency*(Time.time-initialtime)),transform.position.z);
要让对象合拍,这样它就得从其最大振幅开始。此时要使用余弦。但更重要的是,要让它从一端跳跃到另一端,这样它就不会像波纹一样滑上滑下。这时要用cos^2,这样它才会突然停在0标记,并再次走向正数。因此:
transform.position = new Vector3(transform.position.x,maxheight*Mathf.Pow(Mathf.Cos(
2*Mathf.PI*frequency*(Time.time-initialtime)),2),transform.position.z)
这里要注意舞动的高度。最终旋转要使用正弦,这样其旋转和转化就是异相的。因此:
transform.rotation = Quaternion.EulerAngles(0, maxRotation*
Mathf.Cos(2*Mathf.PI*frequency*Mathf.Sin(Time.time-initialtime)), 0);

纹理补偿
Unity3D制作2D动画方法也有多种:
1、动画帧序列
作为常见的方法,相信很多开发者都会用。与cocos2d一样,Unity中也可以使用动画帧使你的角色动起来。示例代码:
using UnityEngine;
using System.Collections;
public class AnimateDemo : MonoBehaviour {

public Texture[] frames;
public float framesPerSecond=10;

private int index;
private float dTime=0;

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
AnimaOne();
AnimaAlways();

}

void AnimaAlways(){

int nowIndex=(int)(Time.time *framesPerSecond) % frames.Length;

if(index!=nowIndex){

index = nowIndex;
renderer.material.mainTexture = frames[index];

}
}

void AnimaOne(){
dTime+=Time.deltaTime;

if(dTime>1/framesPerSecond){
dTime-=1/framesPerSecond;
renderer.material.mainTexture = frames[++index];

if(index+1>=frames.Length)
{

}
}

}
}

这里代码很详细,没有执行过,到时动画帧按照这种思路可以轻松实现。AnimaOne方法可以在动画最后一帧的时候实现其他控制;AnimaAlways方法则一直循环播放动画。
2、动画渲染
有些情况动画帧太多或者太浪费资源,我们就把动画做在一张图片上,控制相机或者材质渲染图片的位置。个人认为这种方法比较适合数据,Tag的动态显示。

3、上面介绍了简单的动画效果,其实在游戏中,我们经常要使游戏里的角色们动起来,位移,旋转,等等。
在Unity中,没有刚体的Object的位移和旋转都是通过Transform属性来控制的。transform下有position和rotation属性,且Unity提供了普通旋转和位移的方法。最常用的就是通过坐标增量来控制Object的动作。这里比较难缠的一点就是相对位移和绝对位移。所以在做object移动的时候要格外小心,是相对世界坐标还是其parent的坐标。
其次iTween是做2D动画比较常用的插件。其官网和其他博客对方法的使用有比较详细的介绍。这里叙述一点,就是关于iTween.Hash().iTween提供了hash表,使得简单的动画更加自然和多样。hash的参数根据iTween不同的方法而稍有差异。
比较常用的:
x,y,z,表示目标Vectore3的量;
time,时间;
easeType,过渡方式,平滑,直线,或者其他;
incomplete,当前iTween动画结束调用的动作或这方法;等等。

热心网友 时间:2022-06-17 01:35

我是这么认为,你要在linux下面做这个东西,而且如果你所要描述的分子都在二维平面上运动。我觉得用gtk完全可以,而且开发应该比较简单。你可以使用GtkDrawingArea这个类似一个画布你可以在里面画一些圆或者其他的。实时的刷新一下就应该有效果了。保存动态图片我还没想到好办法,不过把每一帧保存下来最后应该能合成。如果你要做3d模型应该选vtk,这个是一个专门开发医学软件的。

给你个连接看看
https://developer.gnome.org/gtk3/stable/GtkDrawingArea.html

热心网友 时间:2022-06-17 01:36

要在linux下面做这个东西,而且如果所要描述的分子都在二维平面上运动。

可以使用GtkDrawingArea这个类似一个画布可以在里面画一些圆或者其余的。

实时的刷新一下就应该有效果了。

把每一帧保存下来最后应该能合成。如果要做3d模型应该选vtk,这个是一个专门开发医学软件的。

热心网友 时间:2022-06-17 01:36

其实用C++的话,最好就是用一款游戏引擎,添加帧做成动画就很简单了,比如说cocos2d-x分子运动属于物理现象,甚至直接可以用该引擎包含的物理引擎实现。

热心网友 时间:2022-06-17 01:37

可以用MFC做

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com