首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

请问3D祖玛中,球按路径旋转的算法或思想!

2012-02-05 
请教3D祖玛中,球按路径旋转的算法或思想!!!请大虾指点:请教3D祖玛中,球按路径旋转的算法或思想!这部分还真

请教3D祖玛中,球按路径旋转的算法或思想!!!
请大虾指点: 
请教3D祖玛中,球按路径旋转的算法或思想!这部分还真难.谢谢. 
方法1:计算当前点与下一点的向量夹角.行不通.

[解决办法]
"球按路径旋转"是什么意思呀? 
是一边走, 一边转吗?
[解决办法]
楼主的意思是球按照一定路径运动吧

可以利用bezier或bspline曲线,根据公式只要算出不同时刻球的不同位置就可以了
[解决办法]
样条曲线插值吧,根据关键点插值计算出一条连续的曲线。

[解决办法]
路径怎么定义的,球就怎么走呗。
[解决办法]

探讨
请问大家的意思是不是.当要转弯时.不用球自身旋转.只要用曲线插值,改变球的坐标,就能达到,自身旋转的效果了/?

[解决办法]
“但是球没有路径它的路径,旋转对应的角度”

这句话没有看懂
[解决办法]
探讨
请问大家的意思是不是.当要转弯时.不用球自身旋转.只要用曲线插值,改变球的坐标,就能达到,自身旋转的效果了/?

[解决办法]
曲线插值 矩阵旋转都太复杂了
用数组存一组值做路径
然后把你的球旋转后抓一些桢下来
沿着路径移动的时候每个球循环显示这些图片就行了
[解决办法]
探讨
矩阵旋转不难,问题是球怎样可以,正确的沿路径,自身旋转出对应的角度?

[解决办法]
探讨
矩阵旋转不难,问题是球怎样可以,正确的沿路径,自身旋转出对应的角度?

[解决办法]
斑竹给出贝赛尔插值公式~
自转就是以运动路径为轴心旋转,这个可能要看下线代
[解决办法]
楼主可以参考我的一篇blog

http://blog.csdn.net/zhangci226/archive/2009/09/02/4512438.aspx
[解决办法]
我想这样,你根据球的速度给他一个角速度,看起来就是球在轨道上滚了。

因为 角速度(弧度)*半径=速度,很容易求阿
[解决办法]
探讨
引用:楼主可以参考我的一篇blog http://blog.csdn.net/zhangci226/archive/2009/09/02/4512438.aspx
就是你这个,但你这个是OP的物体自身矩阵来设置XYZ旋转吧.我的是DX物体自身矩阵呀.请问有没有DX的?


楼上这位大虾..我不是求速度,我是求,当前点,球是X/Y/Z哪个方向旋转.旋转多少?


请问大家还有没有呀?

[解决办法]
俺觉得也可以定义一个数组有N个元素,每个元素代表一个位置。
球从一个位置移动到下一个位置。两点之间可以直线插值。位置数组的内存的需求量还可以接受。
当然这个办法比较低级。
[解决办法]
正如楼上各位所说,路径是用曲线来实现的,球沿着曲线路径滚动,根据曲线上点坐标可以很方便的得出切线方向,根据这个方向对球的图片进行一定角度的旋转即可。我自己的代码里面就是这么做的。楼主注意看下面截图中每个球的朝向:


[解决办法]
Zuma游戏的核心和难点之一就是曲线路径的实现,曲线模型决定了后续处理的繁简
[解决办法]
楼主不要着急,SexyCurve应该可以解答你的迷惑:
http://www.mooktown.com/sexyfaq/sexycurves.html

这个例子是基于Popcap SexyAppSDK的,而这个SDK,成就了许多著名的Popcap休闲小游戏(祖玛,吞食鱼,宝石迷阵,植物大战僵尸……)。

例子代码的精髓就是CubicSpline(3次样条曲线)的实现,但有较大的改进余地,否则达不到实时运行的要求。

[解决办法]
Popcap的SexyApp是开源的,用来开发小游戏是个不错的选择 ^^
[解决办法]
例子代码里面就有算法 弄下来看看就明白了。
这么说吧:一个曲线的方程决定之后 根据坐标求其上任一点的算法也就出来了
看一下头文件:

C/C++ code
#pragma once#ifndef __NATURALCUBICSPLINE_H__#define __NATURALCUBICSPLINE_H__#include "CommonDef.h" <- 这是我自己的共同头文件,不必理会#include <vector>using namespace std;//-----------------------------------------// Name: class Cubic// Desc: representation of Cubic//-----------------------------------------class Cubic{    double a,b,c,d;         /* a + b * u + c * u^2 + d * u^3 */ <- 这就是样条曲线的方程public:    Cubic(double a, double b, double c, double d)    {        this->a = a;        this->b = b;        this->c = c;        this->d = d;    }    ~Cubic(){};    /** evaluate cubic */public:    // evaluate cubic    double eval(double u) <- 根据曲线上点的坐标求函数值(这里u其实是点在曲线上的位移)    {        return ( ( ( d * u ) + c) * u + b ) * u + a;    }    // get tangent( derivative )<- 根据曲线上点的坐标求Tangent,也就代表了切线方向    double tangent(double u)    {        return ( ( 3 * d * u ) + 2 * c ) * u + b;    }};//-----------------------------------------// Name: class NaturalCubicSpline// Desc: representation of NaturalCubicSpline//-----------------------------------------class NaturalCubicSpline{protected:    vector<Cubic>            mYCubics;    vector<Cubic>            mXCubics;    vector<double>            mXCoords;    vector<double>            mYCoords;    vector<Point>            mPoints;    vector<FPoint>            mSpline;    vector<double>            mSplineSegmentLengths;    virtual void            RegenerateSpline(vector<double>& theInput, vector<Cubic>& theOutput);    virtual void            RegenerateClosedSpline(vector<double>& theInput, vector<Cubic>& theOutput);    virtual double            GetMinUFromLineAB(FPoint A, FPoint B, Point C);    virtual double            GetMinDistanceFromLineAB(FPoint A, FPoint B, Point C);    double                    mArcLength;    unsigned int            mGranularity;    bool                    mClosed;public:    NaturalCubicSpline(void);    virtual ~NaturalCubicSpline(void);    // Drawing Functions    virtual void                Draw(IDirect3DDevice9* pd3dDevice);    virtual void                DrawControlPoint(IDirect3DDevice9* pd3dDevice, int theControlPointId, int theWidth);    virtual void                DrawSplineSegment(IDirect3DDevice9* pd3dDevice, int theSplineSegmentId, D3DCOLOR color = D3DCOLOR_XRGB(0x00,0xff,0x00) );    // The main functions    virtual void                AddPoint(Point thePoint);    virtual void                RegenerateSplines();    // You Shouldn't have to call this.    virtual FPoint                GetPointAt(double theDistanceOnTheSpline);    virtual FPoint                GetTangentAt(double theLength);    // ADT functions    virtual int                    GetNumControlPoints(){return (int)mPoints.size();};    virtual int                    GetNumSplineSegments(){return (int)mXCubics.size();};    virtual double                GetArcLength(){return mArcLength;};    virtual void                SetClosed(bool bClosed){mClosed = bClosed; RegenerateSplines();};    virtual bool                isClosed(){return mClosed;};    virtual int                    GetGranularity(){return mGranularity;};    virtual void                SetGranularity(int theGranularity){mGranularity = theGranularity; RegenerateSplines();};    // For Curve Refinement    virtual void                BisectSegment(int theSplineSegmentId);    virtual void                DeleteControlPoint(int theControlPointId);    virtual void                ClearAllPoints();    // Picking Helper Functions    virtual double                GetClosestPointOnSegmentToPoint(Point thePoint);    virtual int                    GetControlPointIdNear(Point thePoint);    virtual int                    GetSegmentIdNear(Point thePoint);    virtual Point                GetControlPoint(int theControlPointId);    virtual void                SetControlPoint(int theControlPointId, Point thePoint);    virtual int                    GetNextSegmentId(int theId);    virtual int                    GetNextControlPointId(int theId);    virtual int                    GetPrevSegmentId(int theId);    virtual int                    GetPrevControlPointId(int theId);    //Serialization    virtual HRESULT                SaveToFile(CString theFileName);    virtual HRESULT                OpenFile(CString theFileName);};#endif// !defined(__NATURALCUBICSPLINE_H__) 


[解决办法]
虽说算法是实现zuma的关键。俺倒是对一些细节比较感兴趣,想跟楼主探讨下,比如球插入队列时候的动态效果如何实现
[解决办法]
你得有一个网络相册,然后就回复框上边的插入图片功能,写上图片的URL就行。
[解决办法]
刚做完一个类似的游戏,当时就是这个问题没办法解决,后来用数据表做的,做表做到手抽筋~~~
[解决办法]
去看看我做的战龙飞燕祖玛!

热点排行