我得到鼠標輸入從點A
到點B
畫一條線到紋理上。我意識到我沒有觸及每個像素,因此將鼠標從左側移動到屏幕的右側,會跳過一些值,導致間隙。當我慢慢移動鼠標時,它會變得更好。輸入鼠標位置沒有準確捕獲?
我正在使用鼠標的位置:
var viewPortPosition = Camera.main.ScreenToViewportPoint (Input.mousePosition);
我得到鼠標輸入從點A
到點B
畫一條線到紋理上。我意識到我沒有觸及每個像素,因此將鼠標從左側移動到屏幕的右側,會跳過一些值,導致間隙。當我慢慢移動鼠標時,它會變得更好。輸入鼠標位置沒有準確捕獲?
我正在使用鼠標的位置:
var viewPortPosition = Camera.main.ScreenToViewportPoint (Input.mousePosition);
如果你想畫一條線我您在使用line renderer建議。假設你在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;
}
我已經結束忙什麼做的是運行通過布氏畫線的迄今收集的鼠標位置的功能柵格化線。
來源:
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 ;
}
}
}
代碼的原始來源,但修改後用於統一C#:All cases covered Bresenham's line-algorithm
我喜歡這個。輸入點是世界還是像素值? – Programmer
謝謝。它是映射到屏幕空間座標的2D世界鼠標輸入座標。 – user1767754
O.我明白了。我認爲這是世界空間 – Programmer
我知道LineRenderer,並且之前使用過它,實際上也在考慮使用LineRenderer來將曲線參數化並柵格化到紋理上。我不想採用LineRenderer方法的原因是,有一點我會耗盡內存。在紋理上繪畫會讓我始終保持一個固定的畫布。 – user1767754
@ user1767754您可以輕鬆實現,以避免在重複使用相同內存(例如使用緩衝區)時耗盡內存。所以我仍然會選擇LineRenderer。 –
如果您不再需要內存,則可以重複使用相同的內存。但是,當你想不斷繪製並保持線條時,它可能會非常棘手。如果我有一個固定的畫布,我不會有問題。我可能不得不尋找一種混合解決方案,用Linerenderer繪製線條,完成後將它們濺到紋理上。我仍然困惑爲什麼鼠標位置被跳過。 – user1767754