通过金属中的任意 (x,y) 点围绕 z 轴旋转
Posted
技术标签:
【中文标题】通过金属中的任意 (x,y) 点围绕 z 轴旋转【英文标题】:Rotation around z- axis through arbitary (x,y) point in metal 【发布时间】:2019-01-06 14:53:43 【问题描述】:我有一个有四个顶点的平面。可以绕z轴(0, 0,1)旋转。(实现在金属中使用模型矩阵)。模型矩阵根据旋转手势改变。
所以我需要做的是通过任意 (x,y) 围绕 z 轴旋转平面,其中 x,y 不等于零。这意味着围绕垂直于 xy 平面的轴旋转平面并通过 (x ,y) 点。
有什么建议吗?
【问题讨论】:
这通常通过平移 (-x, -y) 以将所需点移动到 (0, 0),旋转,然后平移 (x, y) 来实现。当然,您可以将这些矩阵组合成一个单一的变换矩阵,同时完成所有这些操作。 我希望它会起作用。但是有什么方法可以实现流畅的翻译?我的意思是翻译这么多会导致翻译不流畅 我不明白你的意思。帧之间“平滑”?这一切都应该在一帧中发生。用户不应该看到翻译。 首先我认为是错误的。最近我明白了你的建议。它完美地工作。再次感谢。 【参考方案1】:这对我有用。在这里,dragCanvas 方法更改模型 matix 中的平移,而 rotateCanvas 更改其旋转。您可以实现自己的方法。方法 convertCoodinates 映射坐标系以适应 https://developer.apple.com/documentation/metal/hello_triangle 中的描述
@objc func rotate(rotateGesture: UIRotationGestureRecognizer)
guard rotateGesture.view != nil else return
let location = rotateGesture.location(in: self.view)
var rotatingAnchorPoint = convertCoodinates(tapx:location.x , tapy:location.y )
if rotateGesture.state == UIGestureRecognizerState.changed
print("rotation:\(rotateGesture.rotation)")
renderer?.dargCanvas(axis:float3(Float(rotatingAnchorPoint.x) ,Float(rotatingAnchorPoint.y ),0))
renderer?.rotateCanvas(rotation:Float(rotateGesture.rotation))
renderer?.dargCanvas(axis:float3(Float(-rotatingAnchorPoint.x ) ,Float(-rotatingAnchorPoint.y ),0))
rotateGesture.rotation = 0
else if rotateGesture.state == UIGestureRecognizerState.began
else if rotateGesture.state == UIGestureRecognizerState.ended
【讨论】:
以上是关于通过金属中的任意 (x,y) 点围绕 z 轴旋转的主要内容,如果未能解决你的问题,请参考以下文章