所以我有以下代码来创建自定义墙
let wall = SCNPlane(width: CGFloat(distance),
height: CGFloat(height))
wall.firstMaterial = wallMaterial()
let node = SCNNode(geometry: wall)
// always render before the beachballs
node.renderingOrder = -10
// get center point
node.position = SCNVector3(from.x + (to.x - from.x) * 0.5,
from.y + height * 0.5,
from.z + (to.z - from.z) * 0.5)
node.eulerAngles = SCNVector3(0,
-atan2(to.x - node.position.x, from.z - node.position.z) - Float.pi * 0.5,
0)
现在我在 HitTest 中添加简单的 SCNPlane 并添加视频(skscene 到它)
// first.node is hittest result
let node = SCNNode(geometry: SCNPlane(width: CGFloat(width) , height: CGFloat(height))
node.geometry?.firstMaterial?.isDoubleSided = true
node.geometry?.firstMaterial?.diffuse.contents = self.create2DVideoScene(xScale: first.node.eulerAngles.y < 0 ? -1 : nil)
node.position = nodesWithDistance.previous.node.mainNode.position
node.eulerAngles = first.node.eulerAngles
这里我是如何创建二维节点的
/// Creates 2D video scene
private func create2DVideoScene (xScale:CGFloat?) -> SKScene {
var videoPlayer = AVPlayer()
if let validURL = Bundle.main.url(forResource: "video", withExtension: "mp4", subdirectory: "/art.scnassets") {
let item = AVPlayerItem(url: validURL)
videoPlayer = AVPlayer(playerItem: item)
}
let videoNode = SKVideoNode(avPlayer: videoPlayer)
videoNode.yScale *= -1
// While debug I observe that if first.node.rotation.y in - , then we need to change xScale to -1 (when wall draw from right -> left )
if let xScale = xScale {
videoNode.xScale *= xScale
}
videoNode.play()
let skScene = SKScene(size: self.sceneView.frame.size)
skScene.scaleMode = .aspectFill
skScene.backgroundColor = .green
skScene.addChild(videoNode)
videoNode.position = CGPoint(x: skScene.size.width/2, y: skScene.size.height/2)
videoNode.size = skScene.size
return skScene
}
问题::如果我从左到右绘制墙节点意味着第一个点在左侧,另一个点在右侧并在它们之间绘制墙。然后视频翻转。
如果我从右到左绘制意味着第一个点在右侧,第二个点在左侧并在它们之间画线,那么视频就很好了。
为了解决这个问题,我检查了墙 eulerAngles 检查行 self.create2DVideoScene 但这并不是在现实世界的每个领域都有效
我希望视频不应该在用户面前开始翻转
编辑
视频被翻转是因为 eulerAngles 在创建墙时在两种情况下都不同
Angle point1 to point2 --> (0.000000 -1.000000 0.000000 3.735537)
Angle point2 to point1 -- > (0.000000 -1.000000 0.000000 0.478615)
问题视频Click here to play video
请提供此问题的建议或解决方案。
视频翻转
Best Answer-推荐答案 strong>
我已经解决了临时解决方案的问题,仍在寻找更好的解决方案
问题是墙。当从右到左方向绘制时,墙会翻转到相机的另一侧。我已经通过设置 isDoubleSided = false 并通过将图像应用为具有文本的漫反射内容来解决这个问题,我可以看到图像本身被翻转了。
我尝试了很多东西,但这个对我有帮助
- 归一化向量
- 找到 SCNVectors 之间的交叉点
- 如果 y > 0 我只是从值交换到值
代码
let normalizedTO = to.normalized()
let normalizedFrom = from.normalized()
let angleBetweenTwoVectors = normalizedTO.cross(normalizedFrom)
var from = from
var to = to
if angleBetweenTwoVectors.y > 0 {
let temp = from
from = to
to = temp
}
// Inside extension of SCNVector3
func normalized() -> SCNVector3 {
if self.length() == 0 {
return self
}
return self / self.length()
}
func cross(_ vec: SCNVector3) -> SCNVector3 {
return SCNVector3(self.y * vec.z - self.z * vec.y, self.z * vec.x - self.x * vec.z, self.x * vec.y - self.y * vec.x)
}
希望对您有所帮助。如果有人知道更好的解决方案,请回答。
关于ios - ARKit 添加了 X 翻转的 2D 视频,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/53282351/
|