通过金属中的任意 (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 轴旋转的主要内容,如果未能解决你的问题,请参考以下文章

将围绕任意轴的旋转解析为围绕 X、Y 和 Z 轴的旋转

通过滑块在世界空间中围绕轴 x、y、z 旋转图元

使用OpenGL在C ++中同时围绕其(x,y&z)轴旋转对象

Unity中的旋转方式

仅在绘图中围绕 z 轴旋转

如何使用 3D 中的变换矩阵围绕 Z 轴旋转?