ios 全景浏览效果demo

//http://blog.csdn.net/donny_zhang/article/details/9063879

demo功能:全景浏览 效果,可上下左右前后转动浏览。

demo说明:项目中pano.jpg 是贴图 。将这个图贴到球型模型上,摄像机设定为球的中心点,在内向球外观看贴图。

demo截屏:


demo主要代码:plview.m部分(显示全景的view)

  1. #import "PLView.h"   
  2.   
  3. @interface PLView ()  
  4.   
  5. - (void)initializeValues;  
  6.   
  7. @end  
  8.   
  9. @implementation PLView  
  10.   
  11. @synthesize type;  
  12. @synthesize camera;  
  13.  
  14. #pragma mark -  
  15. #pragma mark init methods   
  16.   
  17. - (void)allocAndInitVariables  
  18. {  
  19.     [super allocAndInitVariables];  
  20.     scene = [PLScene scene];  
  21.     renderer = [PLRenderer rendererWithView:self scene:[scene retain]];  
  22.     camera = [PLCamera camera];  
  23. }  
  24.   
  25. - (void)initializeValues  
  26. {  
  27.     [super initializeValues];  
  28.     textures = [[NSMutableArray array] retain];  
  29.     type = PLViewTypeUnknown;  
  30. }  
  31.   
  32. - (void)reset  
  33. {  
  34.     if(camera)  
  35.         [camera reset];  
  36.     [super reset];  
  37. }  
  38.  
  39. #pragma mark -  
  40. #pragma mark property methods   
  41.   
  42. - (void)setType:(PLViewType)value  
  43. {  
  44.     type = value;  
  45.     if(sceneElement)  
  46.         [sceneElement release];  
  47.       
  48.     switch (value) {  
  49.         case PLViewTypeCylindrical:  
  50.             camera.fovFactorRange = PLRangeMake(kDefaultCylinderFovFactorMinValue, kDefaultCylinderFovFactorMaxValue);  
  51.             sceneElement = [PLCylinder cylinder];  
  52.             break;  
  53.         case PLViewTypeSpherical:  
  54.             camera.fovFactorRange = PLRangeMake(kDefaultFovFactorMinValue, kDefaultFovFactorMaxValue);  
  55.             sceneElement = [PLSphere sphere];  
  56.             break;  
  57.         case PLViewTypeCubeFaces:  
  58.             camera.fovFactorRange = PLRangeMake(kDefaultFovFactorMinValue, kDefaultFovFactorMaxValue);  
  59.             sceneElement = [PLCube cube];  
  60.             break;  
  61.         case PLViewTypeUnknown:  
  62.             sceneElement = nil;  
  63.             break;  
  64.         default:  
  65.             [NSException raise:@"Invalid panorama type" format:@"Type unknown", nil];  
  66.             break;  
  67.     }  
  68.       
  69.     if(sceneElement)  
  70.     {  
  71.         sceneElement = [sceneElement retain];  
  72.         for(PLTexture * texture in textures)  
  73.             [sceneElement addTexture:texture];  
  74.         [scene addElement:sceneElement];  
  75.     }  
  76. }  
  77.  
  78. #pragma mark -  
  79. #pragma mark draw methods   
  80.   
  81. - (void)drawView   
  82. {      
  83.     [super drawView];  
  84.   
  85.     [sceneElement clonePropertiesOf:camera];  
  86.     [scene.currentCamera cloneCameraProperties:camera];  
  87.     scene.currentCamera.rotation = PLRotationMake(0.0f, 0.0f, 0.0f);  
  88.     scene.currentCamera.position = PLPositionMake(0.0f, 0.0f, 0.0f);  
  89.       
  90.     if(!isValidForFov && !isValidForOrientation)  
  91.         [sceneElement rotateWithStartPoint:startPoint endPoint:endPoint sensitivity:camera.rotateSensitivity];  
  92.     [renderer render];  
  93.   
  94.     camera.rotation = PLRotationMake(sceneElement.pitch, sceneElement.yaw, sceneElement.roll);    
  95. }  
  96.  
  97. #pragma mark -  
  98. #pragma mark fov methods   
  99.   
  100. - (BOOL)calculateFov:(NSSet *)touches  
  101. {  
  102.     if([super calculateFov:touches])  
  103.     {  
  104.         [camera addFovWithDistance:fovDistance];  
  105.         [scene.currentCamera addFovWithDistance:fovDistance];  
  106.         return YES;  
  107.     }  
  108.     return NO;  
  109. }  
  110.  
  111. #pragma mark -  
  112. #pragma mark texture methods   
  113.   
  114. - (void)addTexture:(PLTexture *)texture  
  115. {  
  116.     [textures addObject:texture];  
  117.     if(sceneElement)  
  118.         [sceneElement addTexture:texture];  
  119. }  
  120.                   
  121. - (void)removeTexture:(PLTexture *)texture  
  122. {  
  123.     [textures removeObject:texture];  
  124.     if(sceneElement)  
  125.         [sceneElement removeTexture:texture];  
  126. }  
  127.                   
  128. - (void)removeTextureAtIndex:(NSUInteger) index  
  129. {  
  130.     [textures removeObjectAtIndex:index];  
  131.     if(sceneElement)  
  132.         [sceneElement removeTextureAtIndex:index];  
  133. }  
  134.                   
  135. - (void)removeAllTextures  
  136. {  
  137.     [textures removeAllObjects];  
  138.     if(sceneElement)  
  139.         [sceneElement removeAllTextures];  
  140. }  
  141.  
  142. #pragma mark -  
  143. #pragma mark orientation methods  
  144.   
  145. - (void)orientationChanged:(UIDeviceOrientation)orientation  
  146. {  
  147.     if(camera && sceneElement)  
  148.     {  
  149.         camera.orientation = orientation;  
  150.         sceneElement.orientation = orientation;  
  151.         camera.pitchRange = sceneElement.pitchRange;  
  152.         camera.yawRange = sceneElement.yawRange;  
  153.         camera.rollRange = sceneElement.rollRange;  
  154.         camera.rotation = PLRotationMake(sceneElement.pitch, sceneElement.yaw, sceneElement.roll);  
  155.     }  
  156. }  
  157.  
  158. #pragma mark -  
  159. #pragma mark dealloc methods   
  160.   
  161. - (void)dealloc   
  162. {      
  163.     if(textures)  
  164.         [textures release];  
  165.     if(camera)  
  166.         [camera release];  
  167.     if(sceneElement)  
  168.         [sceneElement release];  
  169.     if(scene)  
  170.         [scene release];  
  171.     if(renderer)  
  172.         [renderer release];  
  173.     [super dealloc];  
  174. }  
  175.                   
  176. @end  
#import "PLView.h"

@interface PLView ()

- (void)initializeValues;

@end

@implementation PLView

@synthesize type;
@synthesize camera;

#pragma mark -
#pragma mark init methods

- (void)allocAndInitVariables
{
	[super allocAndInitVariables];
	scene = [PLScene scene];
	renderer = [PLRenderer rendererWithView:self scene:[scene retain]];
	camera = [PLCamera camera];
}

- (void)initializeValues
{
	[super initializeValues];
	textures = [[NSMutableArray array] retain];
	type = PLViewTypeUnknown;
}

- (void)reset
{
	if(camera)
		[camera reset];
	[super reset];
}

#pragma mark -
#pragma mark property methods

- (void)setType:(PLViewType)value
{
	type = value;
	if(sceneElement)
		[sceneElement release];
	
	switch (value) {
		case PLViewTypeCylindrical:
			camera.fovFactorRange = PLRangeMake(kDefaultCylinderFovFactorMinValue, kDefaultCylinderFovFactorMaxValue);
			sceneElement = [PLCylinder cylinder];
			break;
		case PLViewTypeSpherical:
			camera.fovFactorRange = PLRangeMake(kDefaultFovFactorMinValue, kDefaultFovFactorMaxValue);
			sceneElement = [PLSphere sphere];
			break;
		case PLViewTypeCubeFaces:
			camera.fovFactorRange = PLRangeMake(kDefaultFovFactorMinValue, kDefaultFovFactorMaxValue);
			sceneElement = [PLCube cube];
			break;
		case PLViewTypeUnknown:
			sceneElement = nil;
			break;
		default:
			[NSException raise:@"Invalid panorama type" format:@"Type unknown", nil];
			break;
	}
	
	if(sceneElement)
	{
		sceneElement = [sceneElement retain];
		for(PLTexture * texture in textures)
			[sceneElement addTexture:texture];
		[scene addElement:sceneElement];
	}
}

#pragma mark -
#pragma mark draw methods

- (void)drawView 
{    
	[super drawView];

	[sceneElement clonePropertiesOf:camera];
	[scene.currentCamera cloneCameraProperties:camera];
	scene.currentCamera.rotation = PLRotationMake(0.0f, 0.0f, 0.0f);
	scene.currentCamera.position = PLPositionMake(0.0f, 0.0f, 0.0f);
	
	if(!isValidForFov && !isValidForOrientation)
		[sceneElement rotateWithStartPoint:startPoint endPoint:endPoint sensitivity:camera.rotateSensitivity];
	[renderer render];

	camera.rotation = PLRotationMake(sceneElement.pitch, sceneElement.yaw, sceneElement.roll);	
}

#pragma mark -
#pragma mark fov methods

- (BOOL)calculateFov:(NSSet *)touches
{
	if([super calculateFov:touches])
	{
		[camera addFovWithDistance:fovDistance];
		[scene.currentCamera addFovWithDistance:fovDistance];
		return YES;
	}
	return NO;
}

#pragma mark -
#pragma mark texture methods

- (void)addTexture:(PLTexture *)texture
{
	[textures addObject:texture];
	if(sceneElement)
		[sceneElement addTexture:texture];
}
				
- (void)removeTexture:(PLTexture *)texture
{
	[textures removeObject:texture];
	if(sceneElement)
		[sceneElement removeTexture:texture];
}
				
- (void)removeTextureAtIndex:(NSUInteger) index
{
	[textures removeObjectAtIndex:index];
	if(sceneElement)
		[sceneElement removeTextureAtIndex:index];
}
				
- (void)removeAllTextures
{
	[textures removeAllObjects];
	if(sceneElement)
		[sceneElement removeAllTextures];
}

#pragma mark -
#pragma mark orientation methods

- (void)orientationChanged:(UIDeviceOrientation)orientation
{
	if(camera && sceneElement)
	{
		camera.orientation = orientation;
		sceneElement.orientation = orientation;
		camera.pitchRange = sceneElement.pitchRange;
		camera.yawRange = sceneElement.yawRange;
		camera.rollRange = sceneElement.rollRange;
		camera.rotation = PLRotationMake(sceneElement.pitch, sceneElement.yaw, sceneElement.roll);
	}
}

#pragma mark -
#pragma mark dealloc methods

- (void)dealloc 
{    
	if(textures)
		[textures release];
	if(camera)
		[camera release];
	if(sceneElement)
		[sceneElement release];
	if(scene)
		[scene release];
    if(renderer)
		[renderer release];
	[super dealloc];
}
				
@end

demo下载地址:http://download.csdn.net/detail/donny_zhang/5552467


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值