有没有人有任何建议来创建插值样条曲线。我正在尝试用opengl开发游戏,但我不能让对象跟随曲线。该功能应该像......
void interpolatePath(Vec3d startPos, Vec3d targetPos, float u, Vec3d &interpPos)
对象从一个位置开始,用户单击并且对象移动到该点。我现在拥有它以使对象成直线,但我希望它遵循曲线。
以上功能中的直线代码:
//interpPos.x = (u)*targetPos.x+(1-u)*startPos.x;
//interpPos.y = (u)*targetPos.y+(1-u)*startPos.y;
//interpPos.z = (u)*targetPos.z+(1-u)*startPos.z;
bezier曲线是否有效?我该如何实现它?
[X,Y] =(1-T)^ 3P0 + 3(1-T)^ 2tP1 + 3(1-T)T 1 + 2P2 T 1 3P3
谢谢
答案 0 :(得分:0)
您可以使用B-Spline来对给定的点集进行插值,其中多项式或三次插值需要3个点。如果不是,则应为线性插值。在这里,我将为您提供一个使用Eigen lib进行B样条插值的示例。
#include <Eigen/Core>
#include <unsupported/Eigen/Splines>
typedef Eigen::Spline<float, 3> Spline3d;
int main(){
std::vector<Eigen::VectorXf> waypoints;
Eigen::Vector3f po1(2,3,4);
Eigen::Vector3f po2(2,5,4);
Eigen::Vector3f po3(2,8,9);
Eigen::Vector3f po4(2,8,23);
waypoints.push_back(po1);
waypoints.push_back(po2);
waypoints.push_back(po3);
waypoints.push_back(po4);
// The degree of the interpolating spline needs to be one less than the number of points
// that are fitted to the spline.
Eigen::MatrixXf points(3, waypoints.size());
int row_index = 0;
for(auto const way_point : waypoints){
points.col(row_index) << way_point[0], way_point[1], way_point[2];
row_index++;
}
Spline3d spline = Eigen::SplineFitting<Spline3d>::Interpolate(points, 2);
float time_ = 0;
for(int i=0; i<20; i++){
time_ += 1.0/(20*1.0);
Eigen::VectorXf values = spline(time_);
std::cout<< values << std::endl;
}
return 0;
}