首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >三维转换和转换以获取墙壁/房间的角

三维转换和转换以获取墙壁/房间的角
EN

Stack Overflow用户
提问于 2022-08-03 21:15:38
回答 1查看 84关注 0票数 0

我想用RoomPlan提供的数据画出房间里的墙壁线。

我正在使用RoomPlan sdk获取ios 16中一个房间的3d模型。每个墙壁在api中作为一个表面对象返回,其外观如下:

现在最关键的两个信息是维度和转换。尺寸向量是宽度、高度、长度。

在其中一个论坛上,我读到以下内容:

“你可以用变换和尺寸参数来画线。从这两个参数可以推断出四个角:变换的第一列是”右“向量,第二列是”向上“向量。第四列是墙壁/门/开/窗/物体的位置,将这些单位向量和尺寸矢量结合在一起,就能给你角。”

还看到有人在苹果网站上发布了这段代码,以找到一个门的拐角点:

门的中心点可以定义为:点(门、转换3.x、门、门、转换3.z)

代码语言:javascript
复制
upperLeftPoint = Point(centerPoint) 
upperLeftPoint = upperLeftPoint.translate(rightV.negate(), doorWidth/2) 
upperLeftPoint = upperLeftPoint.translate(upV, doorHeight/2)

我对计算机图形学非常陌生,需要从理论上理解这里发生了什么。有人能指导我如何用给定的值来画墙/门的线,或者更具体地找出墙壁/门的拐角点吗?

EN

回答 1

Stack Overflow用户

发布于 2022-09-15 21:41:50

我目前做这件事的方式是在你发布的最后一个代码片段中暗示出来的。我向CapturedRoom.Surface类添加了功能,并创建了一个RoomPoint结构来用下面的代码表示角

代码语言:javascript
复制
extension CapturedRoom.Surface {
    var center: RoomPoint {
        return RoomPoint(x: self.transform[3].x, y: self.transform[3].y, z: self.transform[3].z)
    }
    
    var bottomLeftPoint: RoomPoint {
        let center = self.center
        var x = dimensions.x/2
        var y = dimensions.y/2
        x.negate()
        y.negate()
        let leftBottom = center.translate(x: x, y: y, z: 0)
        return leftBottom
    }
}

struct RoomPoint {
    var x: Float
    var y: Float
    var z: Float
    
    func translate(x: Float, y: Float, z: Float) -> RoomPoint {
        return RoomPoint(x: self.x + x, y: self.y + y, z: self.z + z)
    }
}

任意CaptureRoom曲面的中心似乎都是由变换矩阵中的最后一个向量给出的。曲面维数矢量包含宽度(x)、高度(y)、长度(z)。中心点在我们表面的中心,这意味着两边都有一半的宽度和高度。因此,如果我们取中间,去掉一半的宽度和高度,我们应该得到该表面的左下角。在这种情况下,长度(z)坐标并不重要,因为我们的表面位于垂直平面上,没有深度。我目前正试图通过在这些角点上创建一个多边形来寻找有许多角的房间的表面积。不知道我错了什么地方--希望不是在这个答案里我给了哈哈。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73227889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档