[英]Unity 3D C# camera - nudging/moving camera in direction of mouse or joystick
[英]Moving mouse in direction and rate
我正在嘗試創建一個由操縱桿的右指尖控制的簡單鼠標模擬器。 我試圖讓鼠標沿指示桿的方向移動,並以平滑的壓力值梯度指示速度,但嘗試這樣做時卻遇到了許多障礙。
第一個是如何將角度准確轉換為准確的X和Y值。 我找不到正確實現角度的方法。 以我的方式,對角線的移動速度可能比紅衣主教快得多。 我當時想為X值添加Math.Cos(angle),為Y值添加Math.Sin(angle)來增加鼠標的大小,但是我想不出一種方法來設置它。
第二,是鼠標的平穩移動,這可能是兩者中更重要的。 由於SetPosition()函數僅適用於整數,因此像素隨時間移動的速率似乎非常有限。 我擁有的代碼非常基礎,僅注冊1-10的整數值。 這不僅會在加速度上產生小的“跳躍”,而且還會限制對角線的移動。 目標是使每秒10像素左右,程序以100hz運行,每個周期輸出0.1像素移動。
我以為我可以跟蹤X和Y值的像素“小數”,並在將它們構建為整數時將其添加到軸上,但是我想有一種更有效的方法仍然不會激怒SetPosition()函數。
我覺得Vector2對象應該完成此操作,但是我不知道該角度如何適合。
樣例代碼:
//Poll Gamepad and Mouse. Update all variables.
public void updateData(){
padOne = GamePad.GetState(PlayerIndex.One, GamePadDeadZone.None);
mouse = Mouse.GetState();
currentStickRX = padOne.ThumbSticks.Right.X;
currentStickRY = padOne.ThumbSticks.Right.Y;
currentMouseX = mouse.X;
currentMouseY = mouse.Y;
angle = Math.Atan2(currentStickRY, currentStickRX);
vectorX = (int)( currentStickRX*10 );
vectorY = (int)( -currentStickRY*10 );
mouseMoveVector.X = vectorX;
mouseMoveVector.Y = vectorY;
magnitude = Math.Sqrt( Math.Pow( (currentStickRX - 0), 2 ) + Math.Pow( (currentStickRY - 0), 2 ) );
if (magnitude > 1){
magnitude = 1;
}
//Get values not in deadzone range and re-scale them from 0-1
if(magnitude >= deadZone){
activeRange = (magnitude - deadZone)/(1 - deadZone);
}
Console.WriteLine(); //Test Code
}
//Move mouse in in direction at specific rate.
public void moveMouse(){
if (magnitude > deadZone){
Mouse.SetPosition( (currentMouseX + vectorX), (currentMouseY + vectorY));
}
previousStickRX = currentStickRX;
previousStickRY = currentStickRY;
previousActiveRange = activeRange;
}
注意:我正在使用所有xna框架。
無論如何,如果我沒有正確解釋這些內容,我們深表歉意。 我還沒有找到一個好的資源,我搜索的矢量示例僅以整數增量從A點移動到B點。
任何部分的任何幫助,我們將不勝感激。
我自己還沒有嘗試過,但是從我的角度來看,您應該在讀取后將墊軸歸一化,這樣對角線的移動速度將與基數軸相同。 對於第二部分,我將在浮動變量(例如Vector2)中跟蹤鼠標,並在設置鼠標位置時進行強制轉換(可能會更好地舍入)。
public void Start()
{
mousePosV2 = Mouse.GetState().Position.ToVector2();
}
public void Update(float dt)
{
Vector2 stickMovement = padOne.ThumbSticks.Right;
stickMovement.Normalize();
mousePosV2 += stickMovement*dt*desiredMouseSpeed;
/// clamp here values of mousePosV2 according to Screen Size
/// ...
Point roundedPos = new Point(Math.Round(mousePosV2.X), Math.Round(mousePosV2.Y));
Mouse.SetPosition(roundedPos.X, roundedPos.Y);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.