トップページ > 記事閲覧
3Dポリゴンによるベジエ曲線の出し方
名前:Haru 日時: 2018/10/30 01:49

こんにちは 下記のサイトを参考に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(); }
メンテ

Page: 1 |

Re: 3Dポリゴンによるベジエ曲線の出し方 ( No.1 )
名前:Haru 日時:2018/10/30 01:56

こちらはベジェ曲線用に作った // 残像描画 void DrawSEShadow(); の失敗作です。 カクカクのSwordEffect SE;の情報から精密な3Dポリゴンに計算した座標情報に変換させたいのですが計算が間違っているのでしょうか? // 残像描画(ベジェ曲線) void DrawSEShadowEX() { VERTEX3D Vertex[20 * 5]; WORD Index[60 * 5]; for (int i = 0, k = 0, l = 0; i < SE.num*5; 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*5; 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) { for (int k = 0; k < 5; k++) { float t = 0.2f*k;// 最大1.0f // 0.0 <= t && t <= 1.0 とする。この値を変化させて曲線を作る //2次のベジエ曲線 //(p_x,p_y)はそのtの値でのベジエ曲線の点の位置 Vertex[1 + j*5 + k*2].pos.x = (1 - t)*(1 - t)*SE.Vector[i].top.x + 2 * (1 - t)*t*SE.Vector[i + 1].top.x + t * t*SE.Vector[i + 2].top.x; Vertex[1 + j*5 + k*2].pos.y = (1 - t)*(1 - t)*SE.Vector[i].top.y + 2 * (1 - t)*t*SE.Vector[i + 1].top.y + t * t*SE.Vector[i + 2].top.y; Vertex[1 + j*5 + k*2].pos.z = (1 - t)*(1 - t)*SE.Vector[i].top.z + 2 * (1 - t)*t*SE.Vector[i + 1].top.z + t * t*SE.Vector[i + 2].top.z; Vertex[0 + j*5 + k*2].pos.x = (1 - t)*(1 - t)*SE.Vector[i].hand.x + 2 * (1 - t)*t*SE.Vector[i + 1].hand.x + t * t*SE.Vector[i + 2].hand.x; Vertex[0 + j*5 + k*2].pos.y = (1 - t)*(1 - t)*SE.Vector[i].hand.y + 2 * (1 - t)*t*SE.Vector[i + 1].hand.y + t * t*SE.Vector[i + 2].hand.y; Vertex[0 + j*5 + k*2].pos.z = (1 - t)*(1 - t)*SE.Vector[i].hand.z + 2 * (1 - t)*t*SE.Vector[i + 1].hand.z + t * t*SE.Vector[i + 2].hand.z; Vertex[0 + j*5 + k*2].v = 1.0f; Vertex[0 + j*5 + k*2].u = (float)(i*5 + k) / (SE.num*5); Vertex[1 + j*5 + k*2].v = 0.0f; Vertex[1 + j*5 + k*2].u = (float)(i*5 + k) / (SE.num*5); Vertex[0 + j*5 + k*2].dif.a = SE.Vector[i].alpha * 255; Vertex[1 + j*5 + k*2].dif.a = SE.Vector[i].alpha * 255; } } // 頂点が2つ以上あれば描画する if (SE.num >= 2)DrawPolygonIndexed3D(Vertex, SE.num * 2 * 5, Index, SE.num * 2 * 5 - 2, swordshadowH, TRUE); }
メンテ
Re: 3Dポリゴンによるベジエ曲線の出し方 ( No.2 )
名前:Haru 日時:2018/10/30 01:57

こちらが構造体になります // 剣の残像頂点構造体 typedef struct SwordEffectV{ VECTOR hand; // 建の根元 VECTOR top; // 剣の刃先 float alpha; // 不透明度 }SwordEffectV; typedef struct SwordEffect { COLOR_U8 Color; // 色 int num; // 座標の数 SwordEffectV Vector[10]; // 座標の情報 }SwordEffect;
メンテ
Re: 3Dポリゴンによるベジエ曲線の出し方 ( No.3 )
名前:sandbox 日時:2018/10/31 21:10

typedef struct SwordEffect { COLOR_U8 Color; // 色 int num; // 座標の数 SwordEffectV Vector[10]; // 座標の情報 }SwordEffect; と定義されているので SE.Vector[] の []の中は 0〜9 まで使えます。 しかしコードのあちこちで、[10] になるケースがあります。 今一度、じっくり変数がどう変わっていくかを追ってみてください。
メンテ
Re: 3Dポリゴンによるベジエ曲線の出し方 ( No.4 )
名前:Haru(解決) 日時:2018/11/01 00:18

ああああ! 盆ミスでした! ありがとうございます!m(_ _)m お陰様で綺麗な曲線ができました!
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存