专栏首页每日一篇技术文章SceneKit - 将屏幕坐标转换至游戏场景oc+swift版

SceneKit - 将屏幕坐标转换至游戏场景oc+swift版

本节学习目标

如何将屏幕2D坐标转换至3D游戏场景中去

oc 源码

- (SCNVector3)convertToScenOfPoint:(CGPoint)point
{
    CGFloat Z_Far = 0.1;
    CGFloat Screen_Aspect =  [UIScreen mainScreen].bounds.size.width > 400 ? 0.3 : 0.0;
    double Y = tan((double)(self.sceneView.pointOfView.camera.fieldOfView/180/2)*M_PI) * (double)(Z_Far-Screen_Aspect);
    double X = tan((double)(self.sceneView.pointOfView.camera.fieldOfView/2/180)*M_PI) * (double)(Z_Far-Screen_Aspect) * (double)(self.view.bounds.size.width/self.view.bounds.size.height);
    CGFloat alphaX = 2 *  X / self.view.bounds.size.width;
    CGFloat alphaY = 2 *  Y / self.view.bounds.size.height;
    float x = -(CGFloat)X + point.x * alphaX;
    float y = (CGFloat)Y - point.y * alphaY;
    SCNVector3 target = SCNVector3Make((float)(x), (float)(y),(float)(-Z_Far));
    SCNVector3 convertPoint = [self.sceneView.pointOfView convertVector:target toNode:self.sceneView.scene.rootNode];
    NSLog(@"convertPoint X: %f,Y:%f,Z:%f", convertPoint.x, convertPoint.y, convertPoint.z);
    return convertPoint;
}

swift

 /// 将屏幕上的点转化到3D场景中去
func convertToScenOf(point: CGPoint) -> SCNVector3{
     let Z_Far:CGFloat = 0.1
    var Screen_Aspect : CGFloat = UIScreen.main.bounds.size.width > 400 ? 0.3 : 0.0
     // 计算屏幕边缘的距离
    let Y = tan(Double(self.pointOfView!.camera!.fieldOfView/180/2)*Double.pi) * Double(Z_Far-Screen_Aspect)
    let X = tan(Double(self.pointOfView!.camera!.fieldOfView/2/180)*Double.pi) * Double(Z_Far-Screen_Aspect) * Double(self.bounds.size.width/self.bounds.size.height)
     let alphaX = 2 *  CGFloat(X) / self.bounds.size.width
     let alphaY = 2 *  CGFloat(Y) / self.bounds.size.height
     let x = -CGFloat(X) + point.x * alphaX
     let y = CGFloat(Y) - point.y * alphaY
     let target = SCNVector3Make(Float(x), Float(y), Float(-Z_Far))
     return self.pointOfView!.convertPosition(target, to:scene.rootNode)
}

注意

Z_Far:是要放置在屏幕后面多远的距离

上线应用ARFinger 即使用了此方式,欢迎各位下载试玩!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Swift学习第一练——用Swift实现的FlappyBird小游戏

          伴随着apple公司对swift的推广态度深入,swift火的很快,并且swift精简便捷的语法和强大的功能,对于使用Object—C开发iOS的开...

    珲少
  • iOS传感器:使用陀螺仪完成一个小球撞壁的小游戏1. 陀螺仪介绍2. 陀螺仪的使用3. 开始我们的小游戏

    stanbai
  • SwiftShot:为增强现实创建游戏

    了解Apple如何为WWDC18构建精选演示,并获得使用ARKit,SceneKit和Swift制作自己的多人游戏的技巧。

    iOSDevLog
  • 常用开发技巧系列(五)

    前面刚发了这个技巧总结系列的第四篇文章,这篇文章总结的一些日常开发中的技巧或更偏向于Cocos2d方向,因为最近在游戏中有原生的一个客服系统需要加进...

    Mr.RisingSun
  • SceneKit_入门03_节点

    我们已经完成了创建工程的任务,有的人就问了,你不是要将SceneKit 游戏开发,怎么创建的是应用工程,往下看,就这么任性!

    酷走天涯
  • ARKit 简介-使用设备的相机将虚拟对象添加到现实世界中 看视频

    到目前为止,你一定听说过关于增强现实的这个相当新的概念。这项技术并不新鲜,您已经在电影中看到它或在电子游戏中体验过它。我的意思是,如果不是免费的话,一般人群现在...

    iOSDevLog
  • ARKit 简介

    ARKit 简介 苹果在AR一直布局VR,最近的苹果开发者大会上,果家终于放出大招:iOS移动端ARKit平台以及VR兼容新桌面操作系统macOS High S...

    xiangzhihong
  • 到底有多强?苹果的增强现实框架:ARKit

    本篇文章重在 workShop 上苹果工程师的解惑和我对 ARKit 的理解, 最后会简单介绍一下相关技术。

    郭艺帆
  • 五毛的cocos2d-x学习笔记03-控件

    用户1737026

扫码关注云+社区

领取腾讯云代金券