请教3D祖玛中,球按路径旋转的算法或思想!!!
请大虾指点:
请教3D祖玛中,球按路径旋转的算法或思想!这部分还真难.谢谢.
方法1:计算当前点与下一点的向量夹角.行不通.
[解决办法]
"球按路径旋转"是什么意思呀?
是一边走, 一边转吗?
[解决办法]
楼主的意思是球按照一定路径运动吧
可以利用bezier或bspline曲线,根据公式只要算出不同时刻球的不同位置就可以了
[解决办法]
样条曲线插值吧,根据关键点插值计算出一条连续的曲线。
[解决办法]
路径怎么定义的,球就怎么走呗。
[解决办法]
[解决办法]
“但是球没有路径它的路径,旋转对应的角度”
这句话没有看懂
[解决办法]
[解决办法]
曲线插值 矩阵旋转都太复杂了
用数组存一组值做路径
然后把你的球旋转后抓一些桢下来
沿着路径移动的时候每个球循环显示这些图片就行了
[解决办法]
[解决办法]
[解决办法]
斑竹给出贝赛尔插值公式~
自转就是以运动路径为轴心旋转,这个可能要看下线代
[解决办法]
楼主可以参考我的一篇blog
http://blog.csdn.net/zhangci226/archive/2009/09/02/4512438.aspx
[解决办法]
我想这样,你根据球的速度给他一个角速度,看起来就是球在轨道上滚了。
因为 角速度(弧度)*半径=速度,很容易求阿
[解决办法]
[解决办法]
俺觉得也可以定义一个数组有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就行。
[解决办法]
刚做完一个类似的游戏,当时就是这个问题没办法解决,后来用数据表做的,做表做到手抽筋~~~
[解决办法]
去看看我做的战龙飞燕祖玛!