0

補間スプライン曲線を作成するための提案はありますか? 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;

ベジエ曲線は機能しますか? どうすれば実装できますか?

[x,y]=(1–t)^3P0+3(1–t)^2tP1+3(1–t)t^2P2+t^3P3

ありがとうございました

4

1 に答える 1

1

B スプラインを使用して、多項式補間または 3 次補間に 3 点が必要な特定の点セットを補間できます。そうでない場合は、線形補間にする必要があります。ここでは、B-Spline 補間に Eigen libを使用する例を示します。

#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;
}
于 2019-10-29T10:59:47.617 に答える