こんにちは
下記のサイトを参考にDrawPolygonIndexed3Dを使ったベジエ曲線を出したいのですが、
tp://haina.hatenablog.com/entry/2016/05/17/230902
中間地点のカクカクした曲線まで出せましたが、ベジェ曲線の公式を当てはめたりすると、三角ポリゴンの集合体になりぐちゃぐちゃになってしまいます(汗
こちら中間地点のソースコードです
宜しければご教授お願いしますm(__)m
SwordEffect SE;
int swordshadowH; // 剣の残像テクスチャ
// 残像情報追加
void SENewVector(VECTOR hand,VECTOR top) {
// 頂点最大数に達していたら
if (SE.num >= 10) {
SE.num--;
}
// 座標を一つずらす
for (int i = SE.num; i >= 0; i--) {
SE.Vector[i + 1] = SE.Vector[i];
}
// 先頭に座標追加
SE.Vector[0].hand = hand;
SE.Vector[0].top = top;
SE.Vector[0].alpha = 1.0f;
// 座標を増やす
SE.num++;
}
// 残像情報更新
void SEInfo() {
SE.Color = GetColorU8(255, 255, 255, 255);
for (int i = 0; i < SE.num; i++) {
// 不透明度を減少
SE.Vector[i].alpha -= 0.1f;
// 不透明度が0以下なら座標を消す
if (SE.Vector[i].alpha <= 0.0f) {
SE.Vector[i].alpha = 0.0f;
SE.num--;
}
}
// 座標が0以下なら0に調整
if (SE.num <= 0)SE.num = 0;
}
// 残像描画
void DrawSEShadow() {
VERTEX3D Vertex[20*5];
WORD Index[60*5];
for (int i = 0, k = 0, l = 0; i < SE.num; i++) {
Index[0 + l] = k;
Index[1 + l] = k + 2;
Index[2 + l] = k + 1;
Index[3 + l] = k + 1;
Index[4 + l] = k + 2;
Index[5 + l] = k + 3;
k += 2;
l += 6;
}
for (int i = 0; i < 20; i++) {
Vertex[i].norm = VGet(0.0f, 0.0f, -1.0f);
Vertex[i].dif = SE.Color;
Vertex[i].spc = GetColorU8(0, 0, 0, 0);//SE.Color;
Vertex[i].su = 0.0f;
Vertex[i].sv = 0.0f;
}
for (int i = 0,j = 0; i < SE.num; i++,j+=2) {
Vertex[0 + j].pos = SE.Vector[i].hand;
Vertex[0 + j].v = 1.0f;
Vertex[0 + j].u = (float)i/SE.num;
Vertex[1 + j].pos = SE.Vector[i].top;
Vertex[1 + j].v = 0.0f;
Vertex[1 + j].u = (float)i / SE.num;
Vertex[0 + j].dif.a = SE.Vector[i].alpha * 255;
Vertex[1 + j].dif.a = SE.Vector[i].alpha * 255;
}
// 頂点が2つ以上あれば描画する
if(SE.num>=2)DrawPolygonIndexed3D(Vertex,SE.num * 2, Index, SE.num * 2 - 2, swordshadowH, TRUE);
}
// メインループ部分
void DrawSwordShadow(void) {
// 残像の座標を取得
VECTOR hand = MV1GetFramePosition(weapon.ModelHandle[0], MV1SearchFrame(weapon.ModelHandle[0], "hand"));
VECTOR top = MV1GetFramePosition(weapon.ModelHandle[0], MV1SearchFrame(weapon.ModelHandle[0], "top"));
// 座標代入
SENewVector(hand, top);
// 座標更新
SEInfo();
// 残像描画
DrawSEShadow();
}