7

私は現在、私の数学の能力をはるかに超えているように見える問題に苦労しています(私がいくつかの適切な数学を作ってから長い時間が経ちました...)そして私はそれについていくつかの助けをいただければ幸いです。

これが私の設定です:私はいくつかの単純な形(長方形)を手に入れました、そして私は原点から来る線上にそれらの底点を「投影」します。この時点まではすべて問題ありません。でも今は、平面に何らかの視点で投影されたかのように歪んだ元の形を描きたいと思います。

コードには、回転、アイソメ図、3Dまたは偽の2D遠近法とは何の関係もないことを考慮してください。グラフィックライブラリを使用していくつかの形状を描画しようとしているだけで、本物の感覚しか得られません。

これが私がやろうとしていることの簡単な図です:

ここに画像の説明を入力してください

私が知っていること :

  • 原点座標
  • 正しい位置とサイズ
  • 赤い線の位置
  • A&Bポイントの座標

私が決定したいのは、C&Dポイントの座標です。これは、「原点ビス」座標を見つけるのに苦労していなければ簡単なことです。

私がやろうとしているのは、「床」と見なすことができるものに長方形の投影を偽造することです(元の長方形が壁として見える平面に関連しています)。

たぶん私は問題を複雑にしすぎているか、それを行うための他のより簡単な方法を見つけることができないかもしれませんが、私は幾何学や数学のことでもう本当に良くありません... :-(

ご回答ありがとうございます!

4

3 に答える 3

0

あなたが言ったように、あなたは1つの非常に単純な問題に直面しています:

「私が決定したいのは、C & D ポイントの座標です。"Origin bis" 座標を見つけるのに苦労していなければ、簡単にできることです。」

しかし、これらの座標は互いに関連しているため、一方 (または角度などの別の値) がなければ、もう一方を取得することはできません。これを 3D で試す場合は、3D エンジンが「Origin bis」を定義し、C と D 自体の計算を実行できるようにするだけです。

そのため、C と D の配置を計算するためのレッドラインまたは Rect に関連する別の値である「元の bis」が必要になります。

このようなものを作成したことを覚えていますが、単純に固執する方が良い場合もあります。「オリジナルの bis」を自分で定義し (静的またはプレーヤー/背景と共に移動することができます)、C と D を取得します。 A と B は、赤い線よりも低い線を使用するか、または私が行ったように、A と B を取得したら、それらの点から投影を少し下に傾斜/回転させるだけで、次のようになります。プレイヤーに追従する「オリジナルビス」。これは「リアルなものの感覚」をシミュレートするのにうまく機能しますが、悲しいことに、実際に見えるかどうかは、何を描写しているかによって異なります。赤い線の上または下の領域が何であるか (空/地面、地面/水)、および「Origin」と「Origin bis」が光源、消失点などであるかどうかはわかりません。

于 2013-06-07T09:36:22.310 に答える
0

私が正しければ、このコードはあなたが見たかったものを表示します。

まず第一に、オブジェクトと情報の初期設定を無視して、例の状況自体に焦点を当てました。「モノリス」の偽投影シャドウ (以下の例では、任意のオブジェクトが可能であり、テクスチャも含まれています) 私の理由は、Matrix学習する価値のある便利なツールである ActionScript のクラスを使用すると、非常に簡単だからです。

解決策: 組み込みMatrixクラスを使用して、 で傾斜変換を行うことができますDisplayObject。この例を試してください:

(「便利な」部分は _EF EnterFrame ハンドラにあります;))

import flash.display.MovieClip;
import flash.geom.Matrix;
import flash.events.Event;
import flash.display.BitmapData;

const PIP180:Number = Math.PI / 180;
const MAX_SHADOW_HEIGHT_MULTIPLIER:Number = 0.25; // you can also calculate this from an angle, like ... = Math.sin(angle * PIP180);
const ANIM_DEG_PER_FRAME:Number = 1.0 * PIP180; // the shadow creeps at a +1 degree per frame rate

var tx:BitmapData = new MonolithTexture(); // define this BitmapData in the library
var skew:Number = -10 * PIP180; // initial 

var mono:MovieClip = new MovieClip();
mono.graphics.beginBitmapFill(tx);
// drawn that way the registration point is 0,0, so it's standing on the ground
mono.graphics.drawRect(0, -tx.height, tx.width, tx.height);
mono.graphics.endFill();

// align monolith to the "ground"
mono.x = stage.stageWidth / 2;
mono.y = stage.stageHeight - 100;
// make it be 100x300 pixel
mono.width = 100;
mono.height = 300;

var shad:MovieClip = new MovieClip();
// colored:
shad.graphics.beginFill(0x000000);
// or textured:
//shad.graphics.beginBitmapFill(tx);
shad.graphics.drawRect(0, -tx.height, tx.width, tx.height);
shad.graphics.endFill();

addChild(shad); // shadow first
addChild(mono); // then the caster object

addEventListener(Event.ENTER_FRAME, _EF);

function _EF(e:Event):void {
    // animate skew on the positive half circle
    skew = (skew + ANIM_DEG_PER_FRAME) % Math.PI;

    // Matrix takes 6 parameters: a, b, c, d, x, y
    // for this shadow trick, use them as follows:
    // a = width scaling (as mono and shad are drawn in the same way, copy mono.scaleX for a perfect fit
    // b = 0, because we don't want to project the vertical axis of transformation to the horizontal
    // c = horizontal skew
    // d = height scaling * skew * making it a bit flat using the constant
    // x = mono.x, ...
    // y = mono.y since originally mono and shad look alike, only the Matrix makes shad render differently
    var mtx:Matrix = new Matrix(mono.scaleX, 0, Math.cos(skew), mono.scaleY * Math.sin(skew) * MAX_SHADOW_HEIGHT_MULTIPLIER, mono.x, mono.y);
    shad.transform.matrix = mtx;
}

あなたのケースでこれを利用するために知っておくべきことは、次の N ファクターだけです。
Q1: どの角度から影を投影したいですか?
A1: 水平方向の係数はskew変数そのものですが、垂直方向の角度は定数としてここに格納されます。MAX_SHADOW_HEIGHT_MULTIPLIER

Q2: 影を「上」だけに投影したいですか、それとも自由に投影したいですか? A2: 「上向き」でよい場合skewは、正の範囲にとどめます。それ以外の場合は、「下向き」の影についても負の値を取ります。

PS: オブジェクトの内部を基点として 0 y にスナップしないようにレンダリングする場合は、フロート/シンクのように見せるか、両方のオブジェクトを定義済みの値で垂直方向にオフセットし、反対の符号を付けることができます。

于 2013-01-23T15:53:12.527 に答える
0

うーん、正しく理解できたかどうかはわかりませんが、入力パラメーターが少なすぎると思います:

あなたは次の情報が与えられたと言いました:

  • 原点座標
  • rect の位置とサイズ
  • 赤線の位置
  • A & B ポイントの座標

この情報だけで投影された長方形を取得することはできないと思います。さらに、あなたの緑の線と「元のビス」も役に立たないと思います.

おそらく、これを試してみてください: 点 C と D を通る青い線も与えられているとします。次に、長方形の上部をその青い線に投影することで、投影された長方形を見つけることができます。

要約すると、原点 + 2 本の平行線、赤と青の線を定義します。次に、四角形の上部を青い線に投影し、四角形の下部を赤い線に投影して、点A、B、C、Dを得ることができます

これが役立つことを願っています。

于 2012-10-15T12:42:46.213 に答える