2017-07-09 14 views
2

ポイントAからポイントBにテクスチャに線を引くためにマウス入力を取得しています。私はすべてのピクセルを叩いているわけではないことを認識しているので、マウスを画面の左端から右端に移動すると、いくつかの値をスキップしてギャップにつながります。私がマウスをゆっくりと動かすと、より良い状態になります。入力マウスの位置が正確にキャプチャされていませんか?

私が使用してマウスの位置を取得しています:あなたは私はあなたがline rendererを使用することをお勧めラインを描きたい場合は

var viewPortPosition = Camera.main.ScreenToViewportPoint (Input.mousePosition); 

enter image description here

答えて

0

を。 Update()関数でコードを実装したと仮定すると、これはレンダリングされたすべてのフレームと呼ばれます。あなたの動きがかなり遅いにもかかわらず、明らかにあなたの描いた線に隙間を残すほど十分です。以下は

あなたのため正常に動作する必要があり、このlinkからいくつかのコードです:

using System.Collections.Generic; 
using UnityEngine; 

[RequireComponent(typeof(LineRenderer))] 
public class LineRendererTest : MonoBehaviour 
{ 
    List<Vector3> linePoints = new List<Vector3>(); 
    LineRenderer lineRenderer; 
    public float startWidth = 1.0f; 
    public float endWidth = 1.0f; 
    public float threshold = 0.001f; 
    Camera thisCamera; 
    int lineCount = 0; 

    Vector3 lastPos = Vector3.one * float.MaxValue; 


    void Awake() 
    { 
     thisCamera = Camera.main; 
     lineRenderer = GetComponent<LineRenderer>(); 
    } 

    void Update() 
    { 
     Vector3 mousePos = Input.mousePosition; 
     mousePos.z = thisCamera.nearClipPlane; 
     Vector3 mouseWorld = thisCamera.ScreenToWorldPoint(mousePos); 

     float dist = Vector3.Distance(lastPos, mouseWorld); 
     if(dist <= threshold) 
      return; 

     lastPos = mouseWorld; 
     if(linePoints == null) 
      linePoints = new List<Vector3>(); 
     linePoints.Add(mouseWorld); 

     UpdateLine(); 
    } 


    void UpdateLine() 
    { 
     lineRenderer.SetWidth(startWidth, endWidth); 
     lineRenderer.SetVertexCount(linePoints.Count); 

     for(int i = lineCount; i < linePoints.Count; i++) 
     { 
      lineRenderer.SetPosition(i, linePoints[i]); 
     } 
     lineCount = linePoints.Count; 
    } 
+0

私はLineRendererを知っています。以前はこれを使っていましたが、LineRendererを使ってカーブをテクスチャにパラメータ化してラスタライズすることも実際に考えていました。私がLineRendererのアプローチにしたくない理由は、ある時点で私はメモリが足りなくなるからです。テクスチャにペイントすると、私は常に固定されたキャンバスになります。 – user1767754

+0

@ user1767754バッファを使用して同じメモリを再利用する際に、メモリ不足を避けるために簡単に実装できます。だから私はまだLineRendererに行くだろう。 –

+0

メモリが不要な場合は、同じメモリを再利用できます。しかし、あなたが常に線を引いて維持したいとき、それは難しいことがあります。私が固定キャンバスを持っていれば、私は持っていない問題です。おそらくLinerendererとラインを描画するハイブリッドソリューションに行く必要があり、完了したらそれらをテクスチャにスプラットする必要があります。それでも私はマウスの位置をスキップする理由は混乱しています。 – user1767754

1

私は何をやってしまってきたことはラインをラスタライズするブレゼンハムの線描画機能により、これまでに収集したマウスポジションを実行しています。

出典:

public void line(Vector2 pointA, Vector2 pointB, Texture2D texture) { 
    int x = (int)pointA.x; 
    int y = (int)pointA.y; 

    int x2 = (int)pointB.x; 
    int y2 = (int)pointB.y; 

    int w = x2- x ; 
    int h = y2 - y; 
    int dx1 = 0, dy1 = 0, dx2 = 0, dy2 = 0 ; 
    if (w<0) dx1 = -1 ; else if (w>0) dx1 = 1 ; 
    if (h<0) dy1 = -1 ; else if (h>0) dy1 = 1 ; 
    if (w<0) dx2 = -1 ; else if (w>0) dx2 = 1 ; 
    int longest = Math.Abs(w) ; 
    int shortest = Math.Abs(h) ; 
    if (!(longest>shortest)) { 
     longest = Math.Abs(h) ; 
     shortest = Math.Abs(w) ; 
     if (h<0) dy2 = -1 ; else if (h>0) dy2 = 1 ; 
     dx2 = 0 ;    
    } 
    int numerator = longest >> 1 ; 
    for (int i=0;i<=longest;i++) { 
     texture.SetPixel (x, y, Color.red); 

     numerator += shortest ; 
     if (!(numerator<longest)) { 
      numerator -= longest ; 
      x += dx1 ; 
      y += dy1 ; 
     } else { 
      x += dx2 ; 
      y += dy2 ; 
     } 
    } 
} 

enter image description here

オリジナルコードのソースが、ユニティのC#用に変更:All cases covered Bresenham's line-algorithm

+0

私はこれが好きです。入力ポイントはワールドまたはピクセル値ですか? – Programmer

+0

ありがとうございます。 2D-World Mouseの入力座標は、スクリーンスペースの座標にマップされています。 – user1767754

+0

O.私はそれを得る。私はそれが世界宇宙だと思った – Programmer

関連する問題