官方教程 收藏本版 已有2人收藏 +发表新主题
查看: 18262|回复: 3
打印 上一主题 下一主题

metaio SDK 官方教程--官方范例之Dynamic Lighting

[复制链接]

metaio SDK 官方教程--官方范例之Dynamic Lighting

Luc_metaio 发表于 2014-5-7 16:36:27 浏览:  18262 回复:  3 只看该作者 复制链接


本范例主要介绍如何在AR场景中使用动态光源。使用不同的动态光源可以让您的模型看起来更逼真或更奇幻色彩。

metaio SDK提供三种类型的光源:


  • 方向性光源:无衰减,但有方向
  • 点光源:从一个点向所有方向发射光线,有光源位置和光线衰减
  • 聚光灯:圆锥体光型,由位置、方向、外圆锥半径和衰减度来定义

除了上面提到的特性,这三种光源还能添加环境和漫反射光色。环境光总会存在,而漫反射光是根据光源和其他因素(如光方向和物体的角度)计算出来的。

由于移动平台对于着色器的支持有限,目前我们限定同时使用的最多光源数为4



实现方法

此范例使用API函数IMetaioSDK::createLight()来生成三个metaio::ILight实例,而metaio::ILight即是用户改变光源特性的接口。如前文所述,不是所有特性都适用于每个光源。例如,如果您试图对方向性光源添加衰减,系统会在日志信息中给予警告(warning log message)。

为了便于演示,我们在AR场景中使用三个小球来分别代表三个光源。其中,方向性光源并不是一个实际意义上的光源,因为它没有任何衰减且无限延伸。我们关闭光源对三个小球的作用,在实际使用中,您也可以对不需要动态光源的模型进行同样的设置。

默认情况下,光源的坐标系为COS 0—摄像头坐标系。在此范例中,我们需要光源在立方体周围飘动,并使用相对于立方体的坐标。所以,我们把光源的坐标系设置为COS 1。如果您想更多的了解metaio坐标系设置,请点击查看相关教程。
  1. // Windows

  2. m_pMetaioSDK->setAmbientLight(metaio::Vector3d(0.05f));

  3. m_pDirectionalLight = m_pMetaioSDK->createLight();
  4. m_pDirectionalLight->setType(metaio::ELIGHT_TYPE_DIRECTIONAL);
  5. m_pDirectionalLight->setAmbientColor(metaio::Vector3d(0, 0.15f, 0)); // slightly green
  6. m_pDirectionalLight->setDiffuseColor(metaio::Vector3d(0.6f, 0.2f, 0)); // orange
  7. m_pDirectionalLight->setCoordinateSystemID(1);
  8. m_pDirectionalLightGeo = createLightGeometry();
  9. m_pDirectionalLightGeo->setCoordinateSystemID(m_pDirectionalLight->getCoordinateSystemID());
  10. m_pDirectionalLightGeo->setDynamicLightingEnabled(false);

  11. m_pPointLight = m_pMetaioSDK->createLight();
  12. m_pPointLight->setType(metaio::ELIGHT_TYPE_POINT);
  13. m_pPointLight->setAmbientColor(metaio::Vector3d(0, 0, 0.15f)); // slightly blue ambient
  14. m_pPointLight->setAttenuation(metaio::Vector3d(0, 0, 40));
  15. m_pPointLight->setDiffuseColor(metaio::Vector3d(0, 0.8f, 0.05f)); // green-ish
  16. m_pPointLight->setCoordinateSystemID(1);
  17. m_pPointLightGeo = createLightGeometry();
  18. m_pPointLightGeo->setCoordinateSystemID(m_pPointLight->getCoordinateSystemID());
  19. m_pPointLightGeo->setDynamicLightingEnabled(false);

  20. m_pSpotLight = m_pMetaioSDK->createLight();
  21. m_pSpotLight->setAmbientColor(metaio::Vector3d(0.17f, 0, 0)); // slightly red ambient
  22. m_pSpotLight->setType(metaio::ELIGHT_TYPE_SPOT);
  23. m_pSpotLight->setRadiusDegrees(10);
  24. m_pSpotLight->setDiffuseColor(metaio::Vector3d(1, 1, 0)); // yellow
  25. m_pSpotLight->setCoordinateSystemID(1);
  26. m_pSpotLightGeo = createLightGeometry();
  27. m_pSpotLightGeo->setCoordinateSystemID(m_pSpotLight->getCoordinateSystemID());
  28. m_pSpotLightGeo->setDynamicLightingEnabled(false);
复制代码
  1. // Android

  2.     metaioSDK.setAmbientLight(new Vector3d(0.05f));
  3.      
  4.     mDirectionalLight = metaioSDK.createLight();
  5.     mDirectionalLight.setType(ELIGHT_TYPE.ELIGHT_TYPE_DIRECTIONAL);
  6.     mDirectionalLight.setAmbientColor(new Vector3d(0, 0.15f, 0)); // slightly green
  7.     mDirectionalLight.setDiffuseColor(new Vector3d(0.6f, 0.2f, 0)); // orange
  8.     mDirectionalLight.setCoordinateSystemID(1);
  9.     mDirectionalLightGeo = createLightGeometry();
  10.     mDirectionalLightGeo.setCoordinateSystemID(mDirectionalLight.getCoordinateSystemID());
  11.     mDirectionalLightGeo.setDynamicLightingEnabled(false);
  12.      
  13.     mPointLight = metaioSDK.createLight();
  14.     mPointLight.setType(ELIGHT_TYPE.ELIGHT_TYPE_POINT);
  15.     mPointLight.setAmbientColor(new Vector3d(0, 0, 0.15f)); // slightly blue ambient
  16.     mPointLight.setAttenuation(new Vector3d(0, 0, 40));
  17.     mPointLight.setDiffuseColor(new Vector3d(0, 0.8f, 0.05f)); // green-ish
  18.     mPointLight.setCoordinateSystemID(1);
  19.     mPointLightGeo = createLightGeometry();
  20.     mPointLightGeo.setCoordinateSystemID(mPointLight.getCoordinateSystemID());
  21.     mPointLightGeo.setDynamicLightingEnabled(false);
  22.      
  23.     mSpotLight = metaioSDK.createLight();
  24.     mSpotLight.setAmbientColor(new Vector3d(0.17f, 0, 0)); // slightly red ambient
  25.     mSpotLight.setType(ELIGHT_TYPE.ELIGHT_TYPE_SPOT);
  26.     mSpotLight.setRadiusDegrees(10);
  27.     mSpotLight.setDiffuseColor(new Vector3d(1, 1, 0)); // yellow
  28.     mSpotLight.setCoordinateSystemID(1);
  29.     mSpotLightGeo = createLightGeometry();
  30.     mSpotLightGeo.setCoordinateSystemID(mSpotLight.getCoordinateSystemID());
  31.     mSpotLightGeo.setDynamicLightingEnabled(false);
复制代码
  1. // IOS

  2.     m_metaioSDK->setAmbientLight(metaio::Vector3d(0.05f));
  3.      
  4.     m_pDirectionalLight = m_metaioSDK->createLight();
  5.     m_pDirectionalLight->setType(metaio::ELIGHT_TYPE_DIRECTIONAL);
  6.     m_pDirectionalLight->setAmbientColor(metaio::Vector3d(0, 0.15f, 0)); // slightly green
  7.     m_pDirectionalLight->setDiffuseColor(metaio::Vector3d(0.6f, 0.2f, 0)); // orange
  8.     m_pDirectionalLight->setCoordinateSystemID(1);
  9.     m_pDirectionalLightGeo = [self createLightGeometry];
  10.     m_pDirectionalLightGeo->setCoordinateSystemID(m_pDirectionalLight->getCoordinateSystemID());
  11.     m_pDirectionalLightGeo->setDynamicLightingEnabled(false);
  12.      
  13.     m_pPointLight = m_metaioSDK->createLight();
  14.     m_pPointLight->setType(metaio::ELIGHT_TYPE_POINT);
  15.     m_pPointLight->setAmbientColor(metaio::Vector3d(0, 0, 0.15f)); // slightly blue ambient
  16.     m_pPointLight->setAttenuation(metaio::Vector3d(0, 0, 40));
  17.     m_pPointLight->setDiffuseColor(metaio::Vector3d(0, 0.8f, 0.05f)); // green-ish
  18.     m_pPointLight->setCoordinateSystemID(1);
  19.     m_pPointLightGeo = [self createLightGeometry];
  20.     m_pPointLightGeo->setCoordinateSystemID(m_pPointLight->getCoordinateSystemID());
  21.     m_pPointLightGeo->setDynamicLightingEnabled(false);
  22.      
  23.     m_pSpotLight = m_metaioSDK->createLight();
  24.     m_pSpotLight->setAmbientColor(metaio::Vector3d(0.17f, 0, 0)); // slightly red ambient
  25.     m_pSpotLight->setType(metaio::ELIGHT_TYPE_SPOT);
  26.     m_pSpotLight->setRadiusDegrees(10);
  27.     m_pSpotLight->setDiffuseColor(metaio::Vector3d(1, 1, 0)); // yellow
  28.     m_pSpotLight->setCoordinateSystemID(1);
  29.     m_pSpotLightGeo = [self createLightGeometry];
  30.     m_pSpotLightGeo->setCoordinateSystemID(m_pSpotLight->getCoordinateSystemID());
  31.     m_pSpotLightGeo->setDynamicLightingEnabled(false);
复制代码


设置光源特性

由于此功能叫做动态光源而不是静态光源,您可以在运行时刻自如地改变光的特性,其效果会在下一个渲染帧中看到。

在此范例中,我们让光源围绕着立方体旋转,从而使您清楚的看到不同光源会产生何种效果。方向性光源的颜色是棕黄色,点源是绿色的,而聚光灯是黄色的。并且,每个光源都有一小部分其他颜色的环境光。您可以根据自己的需要或兴趣自行设定这个光源的特性。

范例使用的代码会在渲染每一帧之后更新光源特性,但您也可以在其他位置使用此代码。下面的代码循环使用sin/cos函数来生成光源位置,其效果为光源围绕原点旋转,也就是围绕3D模型旋转

您可以随时使用setEnabled()来实现光源的开启与关闭。如果没有光源处于开启状态,那么所有的物体都是在光源关闭状态下渲染的。也就是说,只有物体的颜色被渲染,场景不会受光源或全局环境颜色的干扰。全局环境颜色设定可以和动态光源一起使用来添加“基本光”,这样物体就不会呈现为纯黑色。
  1. // Windows

  2. // Lights circle around
  3. float time = timeGetTime() / 1000.0f;
  4. const metaio::Vector3d lightPos(200*cosf(time), 120*sinf(0.25f*time), 200*sinf(time));

  5. const float FREQ2MUL = 0.4f;
  6. const metaio::Vector3d lightPos2(150*cosf(FREQ2MUL*2.2f*time) * (1 + 2+2*sinf(FREQ2MUL*0.6f*time)), 30*sinf(FREQ2MUL*0.35f*time), 150*sinf(FREQ2MUL*2.2f*time));

  7. const metaio::Vector3d directionalLightDir(cosf(1.2f*time), sinf(0.25f*time), sinf(0.8f*time));


  8. // This will only apply in the upcoming frame:

  9. // Directional light
  10. m_pDirectionalLight->setDirection(directionalLightDir);
  11. updateLightIndicator(m_pDirectionalLightGeo, m_pDirectionalLight);

  12. // Point light
  13. m_pPointLight->setTranslation(lightPos);
  14. updateLightIndicator(m_pPointLightGeo, m_pPointLight);

  15. // Spot light
  16. m_pSpotLight->setTranslation(lightPos2);
  17. m_pSpotLight->setDirection(-lightPos2); // spot towards origin of COS
  18. updateLightIndicator(m_pSpotLightGeo, m_pSpotLight);
复制代码
  1. // Android

  2.     // Lights circle around
  3.     final double time = System.currentTimeMillis() / 1000.0;
  4.     final Vector3d lightPos = new Vector3d(
  5.         200.0f * (float)Math.cos(time),
  6.         120.0f * (float)Math.sin(0.25f*time),
  7.         200.0f * (float)Math.sin(time));
  8.      
  9.     final float FREQ2MUL = 0.4f;
  10.     final Vector3d lightPos2 = new Vector3d(
  11.                     150.0f * (float)(Math.cos(FREQ2MUL*2.2*time) * (1 + 2+2*Math.sin(FREQ2MUL*0.6*time))),
  12.                     30.0f * (float)Math.sin(FREQ2MUL*0.35*time),
  13.                     150.0f * (float)Math.sin(FREQ2MUL*2.2*time));
  14.      
  15.     final Vector3d directionalLightDir = new Vector3d(
  16.                     (float)Math.cos(1.2*time),
  17.                     (float)Math.sin(0.25*time),
  18.                     (float)Math.sin(0.8*time));
  19.      
  20.     // This will only apply in the upcoming frame:
  21.      
  22.     // Directional light
  23.     mDirectionalLight.setDirection(directionalLightDir);
  24.     updateLightIndicator(mDirectionalLightGeo, mDirectionalLight);
  25.      
  26.     // Point light
  27.     mPointLight.setTranslation(lightPos);
  28.     updateLightIndicator(mPointLightGeo, mPointLight);
  29.      
  30.     // Spot light
  31.     mSpotLight.setTranslation(lightPos2);
  32.     // Spot towards origin of COS
  33.     mSpotLight.setDirection(new Vector3d(-lightPos2.getX(), -lightPos2.getY(), -lightPos2.getZ()));
  34.     updateLightIndicator(mSpotLightGeo, mSpotLight);
复制代码
  1. // IOS

  2.     // Lights circle around
  3.     const float time = (float)CACurrentMediaTime();
  4.     const metaio::Vector3d lightPos(200*cosf(time), 120*sinf(0.25f*time), 200*sinf(time));
  5.      
  6.     const float FREQ2MUL = 0.4f;
  7.     const metaio::Vector3d lightPos2(150*cosf(FREQ2MUL*2.2f*time) * (1 + 2+2*sinf(FREQ2MUL*0.6f*time)), 30*sinf(FREQ2MUL*0.35f*time), 150*sinf(FREQ2MUL*2.2f*time));
  8.      
  9.     const metaio::Vector3d directionalLightDir(cosf(1.2f*time), sinf(0.25f*time), sinf(0.8f*time));
  10.      
  11.      
  12.     // This will only apply in the upcoming frame:
  13.      
  14.     // Directional light
  15.     m_pDirectionalLight->setDirection(directionalLightDir);
  16.     [self updateLightIndicator:m_pDirectionalLightGeo light:m_pDirectionalLight];
  17.      
  18.     // Point light
  19.     m_pPointLight->setTranslation(lightPos);
  20.     [self updateLightIndicator:m_pPointLightGeo light:m_pPointLight];
  21.      
  22.     // Spot light
  23.     m_pSpotLight->setTranslation(lightPos2);
  24.     m_pSpotLight->setDirection(-lightPos2); // spot towards origin of COS
  25.     [self updateLightIndicator:m_pSpotLightGeo light:m_pSpotLight];
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享至:
| 人收藏
回复

使用道具 举报

该用户从未签到

沙发
Carly 发表于 2014-5-8 10:12:35 只看该作者
为什么我的这里没有这个Demo?
回复 支持 反对

使用道具 举报

该用户从未签到

板凳
Carly 发表于 2014-5-8 10:12:39 只看该作者
为什么我的这里没有这个Demo?
回复 支持 反对

使用道具 举报

该用户从未签到

地板
Luc_metaio
 楼主|
发表于 2014-5-8 10:48:57 只看该作者
下载最新SDK
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2013-2017 ARinChina-增强现实中国技术论坛   All Rights Reserved.