0

現在の角度を指定して、円(または円の一部)の抽出されたセクションを表す新しいベクトル位置または宛先ベクトル位置を作成する方法を見つけようとしています。具体的には、アニメーションのフレームごとにxとyをインクリメントして、現在のベクトルから目的のベクトルに到達するために必要な合計フロート値を計算する必要があります-(この部分はすでにいくつかの背景情報で行われています)。私はすでに私のプログラムで次の情報を決定しました...ここにサンプルがあります:

  • ベクトル開始:x 1.000000 y 0.000000 z 0.200000
  • ベクトル終了:0.406737 y 0.913545 z 0.200000
  • 外積。x 0.182709、y 0.118653、z -0.913545
  • 開始角度(度):0.000000
  • 度単位の終了角度:66.000000
  • ベクトルの開始と終了の間の角度(度単位):33

以下の方法で位置をインクリメント/デクリメントしてみました

float distanceX = (crossProduct.x > 0) ? crossProduct.x + 0.5 : crossProduct.x - 0.5;
float distanceY = (crossProduct.y > 0) ? crossProduct.y + 0.5 : crossProduct.y - 0.5; 

次に適用します:

translationX = cosf(distanceX) * 1;
translationY = sinf(distanceY) * 1;
translationX /= 10;
translationY /= 10;

取得する:translationX:0.077587 translationY:0.057994

最後に、新しい座標が次の場所に渡されます。

glTranslatef(translationX, translationY, 0.0);

このコードはある程度は機能しますが、円のさまざまな部分、つまり一部のセクターが共有象限にある象限に適用すると、問題が発生します。

すべての回答をありがとう。@MarkOblakによって提案された実装コードは 次のとおりです。

GLKVector4 normalizedVectorStart = GLKVector4Normalize(vStart);
GLKVector4 normalizedVectorEnd = GLKVector4Normalize(vEnd);

GLKVector4 vectorOffset = GLKVector4Add(normalizedVectorStart, normalizedVectorEnd);
GLKVector4 normalizedVectorOffset = GLKVector4Normalize(vectorOffset);

NSLog(@"normalizedVectorOffset x %f y %f z%f", normalizedVectorOffset.x, normalizedVectorOffset.y, normalizedVectorOffset.z);

normalizedVectorOffset x 0.532707 y 0.345944 z0.151473

float sign = GLKVector4DotProduct(normalizedVectorOffset, vStart);
float distanceFromCenter = 0.2;

sign = (sign > 0.0) ? 1.0 : -1.0;

GLKVector4 normalizedVectorOffsetWithSign = GLKVector4MultiplyScalar(normalizedVectorOffset, sign * distanceFromCenter);
NSLog(@"normalizedVectorOffset (sign) x %f y %f z%f", normalizedVectorOffsetWithSign.x, normalizedVectorOffsetWithSign.y, normalizedVectorOffsetWithSign.z);

normalizedVectorOffset(sign)x 0.106541 y 0.069189 z0.030295

4

2 に答える 2

1

オフセットの長さに角度のコサインとサインを掛けることで、特定の角度での特定のポイントからのオフセットを見つけることができます。

例:

#define PI 3.141592654f

float angle = 45.0f;
float angleInRadians = angle * (PI / 180.0f);

float centerX = 0;
float centerY = 0;

float distanceFromCenter = 10.0f;

float offsetX = cos(angleInRadians) * distanceFromCenter;
float offsetY = sin(angleInRadians) * distanceFromCenter;

distanceFromCenterその後、各フレームを補間できます。

于 2012-08-23T04:44:12.907 に答える
0

これを何度も読む必要がありましたが、これを正しく理解していれば、円全体の中心が (0,0,0) にあり、円をスライスする場所を表す中心からの 2 つのベクトルの情報がある場合、あなたの例ははるかに単純です..あなたのベクトルは次のとおりです: offsetVector = normalized((normalized(start) + normalized(end)))

次に、オフセット係数の符号を取得する必要があります: sign = (dotProduct(offsetVector, start) > .0) ? 1.0:-1.0

最終的な結果は次のとおりです。 offsetVector = offsetVector * sign * someFactor ここで、someFactor は、スライスを中心からどれだけ移動するかを表します。

于 2012-08-23T07:07:01.000 に答える