2.6.3 光照特效
光照特效
光照特效是指对场景中的模型添加光照效果,使场景内的模型有明暗对比度,看起来更加真实。
通过光照特效可以对场景添加环境光、漫反射光和镜面光;也可以添加点光源或者平行光等。此外还需要通过光照开关来控制是否启动光照。
下图是光照特效效果:
参数说明1
灯光可配置的参数如下表所示:
配置项 | 配置说明 | 值类型 | 备注 |
---|---|---|---|
OptionsTypeName | 操作配置项类名 | string | LightOptions代表光照更新 |
Operation | 操作类型 | string | 更新操作的类型。主要有:Add-添加; Change-修改; Remove-移除 |
LayerID | 图层ID列表 | int列表 | 传-1则默认对所有图层起效,若为多个图层,可使用xx,xx,xx 此种格式。图层Id可以通过图层对象的GetLayerId()方法获取 |
Ambient | 环境光 | R,G,B,A | 光照颜色取值范围在0-1.0之间,如 "0.9,0.8,0.8,1.0" |
Diffuse | 漫反射光 | R,G,B,A | 光照颜色取值范围在0-1.0之间,如 "0.9,0.8,0.8,1.0" |
Specular | 镜面光 | R,G,B,A | 光照颜色取值范围在0-1.0之间,如 "0.9,0.8,0.8,1.0" |
SpotCutOff | 光源的最大散布角 | float | 聚光光锥的轴与中心线的夹角。默认:180度 |
SpotExponet | 聚光指数 | float | 光的集中程度,该值控制聚光的光强度,会从中心逐渐向外衰减。该值越大,光强度越大。默认为:0.0 |
Attenuation | 衰变系数 | float | 控制聚光衰减因子。默认:1.0 |
Direction | 聚光光线方向 | x,y,z | 定义聚光光锥的轴方向,如 "0.0,0.0,1.0"代表Z轴正方向 |
Position | 光源位置 | x,y,z,w | xyz代表光源位置,需传入经度纬度高程坐标;w代表光源类型, 当w=0时代表方向光, 此时xyz代表光照射方向,当w=1.0时代表点光源 |
参数说明2
光线开关可配置的参数如下表所示:
配置项 | 配置说明 | 值类型 | 备注 |
---|---|---|---|
OptionsTypeName | 操作配置项类名 | string | LightingOptions代表光线开关 |
IsOpen | 是否开启 | string | 是否开启光线。true-开启;false-关闭。默认false |
LayerID | 图层ID列表 | int列表 | 传-1则默认对所有图层起效,若为多个图层,可使用xx,xx,xx 此种格式。图层Id可以通过图层对象的GetLayerId()方法获取 |
代码调用示例
Javascript调用
//创建光线更新操作,同一个对象最多添加 0~1两个光源,多添加将无效
var operationPtr = null;
function createUpdateOperation(){//创建更新操作
if(null == operationPtr){
var tlo = map.CreateOperationOptions("Light");//创建更新配置对象
tlo.AddConfig("OptionsTypeName", "LightOptions");//更新操作类型。LightOptions代表光线更新
tlo.AddConfig("Ambient", "0.9,0.0,0.0,1.0");//环境光
tlo.AddConfig("Operation", "Add");//操作类型。Add-添加;Change-修改;Remove-移除
tlo.AddConfig("LayerID", "-1");//添加图层id, 若值设置为-1则光线将对场景相机进行操作
operationPtr = map.CreateOperation("LightOperation", tlo);//创建更新对象。LightOperation代表光线更新
map.AddOperation(operationPtr);//添加更新对象
}else{
alert("请勿重复创建更新操作!");
}
}
//添加光线
function updateAddLightOption(){
if(null != operationPtr){
var tlo = map.CreateOperationOptions("Light");//创建更新配置对象
tlo.AddConfig("OptionsTypeName", "LightOptions");//更新操作类型。LightOptions代表光线更新
tlo.AddConfig("Ambient", "0.0,0.0,0.5,1.0");//环境光
tlo.AddConfig("Operation", "Add");//操作类型。Add-添加;Change-修改;Remove-移除
//以下注释配置项,需要时打开
//tlo.AddConfig("Diffuse", "1.0,1.0,1.0,1");//漫反射光
//tlo.AddConfig("Specular", "1.0,1.0,1.0,1");//镜面光
//tlo.AddConfig("SpotCutOff",180.0);//光源的最大散布角
//tlo.AddConfig("SpotExponet", 2.0);//聚光源指数
//tlo.AddConfig("Attenuation", 0.9);//衰变系数
//tlo.AddConfig("Direction", "0,0, 0.0, -1.0");//光线方向设置
//tlo.AddConfig("Position", "20,30,40,1.0");//光线位置设置 (x, y, z,w)
tlo.AddConfig("LayerID", -1);//添加图层id, 若值设置为 -1 则光线将对场景相机进行操作
operationPtr.UpdateOperationOptions(tlo);//更新操作
}else{
alert("不存在更新操作对象,无法更新!");
}
}
//修改光线
function updateChangeLightOption() {
if ( null != operationPtr ) {
var tlo = map.CreateOperationOptions("Light");//创建更新配置对象
tlo.AddConfig("OptionsTypeName", "LightOptions");//更新操作类型。LightOptions代表光线更新
tlo.AddConfig("Operation", "Change");//操作类型。Add-添加;Change-修改;Remove-移除
tlo.AddConfig("Ambient", "0.0,1.0,0.0,1.0");//环境光
tlo.AddConfig("LayerID", -1);//添加图层id, 若值设置为 -1 则光线将对场景相机进行操作
operationPtr.UpdateOperationOptions(tlo);//更新操作
}else{
alert("不存在更新操作对象,无法更新!");
}
}
//删除光线
function updateRemoveLightOption(){
if(null != operationPtr){
var tlo = map.CreateOperationOptions("Light");//创建更新配置对象
tlo.AddConfig("OptionsTypeName", "LightOptions");//更新操作类型。LightOptions代表光线更新
tlo.AddConfig("Operation", "Remove");//操作类型。Add-添加;Change-修改;Remove-移除
tlo.AddConfig("LayerID", "-1");//添加图层id, 若值设置为 -1 则光线将对场景相机进行操作
operationPtr.UpdateOperationOptions(tlo);//更新
}else{
alert("不存在更新操作对象,无法更新!");
}
}
//移除更新操作
function removeUpdateOperation(){
if(null != operationPtr){
map.RemoveOperation(operationPtr);//移除更新对象
operationPtr = null;
}else{
alert("不存在更新操作对象,请勿重复删除!");
}
}
//***************** 光线开关设置 **************************
var LightingOperation = null;
//创建更新操作
function CreateLighting(){
if ( null == LightingOperation ) {
var tlo = map.CreateOperationOptions("Lighting");//创建配置类型,操作类型的配置
tlo.AddConfig("OptionsTypeName", "LightingOptions");//光线开关图层配置项名,必须为此值
tlo.AddConfig("LayerID", -1);//添加图层id。若值设置为 -1 则光线将对场景相机进行操作
tlo.AddConfig("IsOpen", "true"); //是否开启
//操作类型添加
LightingOperation = map.CreateOperation("LightingOperation", tlo); //根据配置创建光线开关,必须为此值
map.AddOperation(LightingOperation);//加入操作并执行
}
}
//开启
function OpenLighting() {
if ( null != LightingOperation ){
var tlo = map.CreateOperationOptions("Lighting");
tlo.AddConfig("OptionsTypeName", "LightingOptions");//光线开关图层配置项名,必须为此值
tlo.AddConfig("IsOpen", "true"); //是否开启
LightingOperation.UpdateOperationOptions(tlo); //根据配置更新
}
}
//关闭
function CloseLighting(){
if ( null != LightingOperation ){
var tlo = map.CreateOperationOptions("Lighting");
tlo.AddConfig("OptionsTypeName", "LightingOptions");//光线开关图层配置项名,必须为此值
tlo.AddConfig("IsOpen", "false"); //是否开启
LightingOperation.UpdateOperationOptions(tlo); //根据配置更新
}
}
//移除光线开关
function RemoveLightingOption() {
if( null != LightingOperation ) {
map.RemoveOperation(LightingOperation); //移除操作
LightingOperation = null;
}
}
C++调用
BaseObjectCOMLib::IOperationObjectPtr operationPtr;//光线操作对象
void Cf5c2LightDlg::OnBnClickedcreateupdateoperation()
{
if(operationPtr)
{
return;
}
ConfigOptionsCOMLib::IOperationOptionPtr tlo = map->CreateOperationOptions("Light");//创建更新配置对象
tlo->AddConfig("OptionsTypeName", "LightOptions");//更新操作类型。LightOptions代表光线更新
tlo->AddConfig("Ambient", "0.9,0.0,0.0,1.0");//环境光
tlo->AddConfig("Operation", "Add");//操作类型。Add-添加;Change-修改;Remove-移除
tlo->AddConfig("LayerID", "-1");//添加图层id, 若值设置为-1则光线将对场景相机进行操作
operationPtr = map->CreateOperation("LightOperation", tlo);//创建更新对象。LightOperation代表光线更新
map->AddOperation(operationPtr);//添加更新对象
}
//增加光线
void Cf5c2LightDlg::OnBnClickedupdateaddlightoption()
{
if(!operationPtr)
{
return;
}
ConfigOptionsCOMLib::IOperationOptionPtr tlo = map->CreateOperationOptions("Light");//创建更新配置对象
tlo->AddConfig("OptionsTypeName", "LightOptions");//更新操作类型。LightOptions代表光线更新
tlo->AddConfig("Ambient", "0.2,0.2,0.2,1.0");//环境光
tlo->AddConfig("Operation", "Add");//操作类型。Add-添加;Change-修改;Remove-移除
/**以下注释配置项,需要时打开*/
//tlo->AddConfig("Diffuse", "1.0,1.0,1.0,1");//漫反射光
//tlo->AddConfig("Specular", "1.0,1.0,1.0,1");//镜面光
//tlo->AddConfig("SpotCutOff",180.0);//光源的最大散布角
//tlo->AddConfig("SpotExponet", 2.0);//聚光源指数
//tlo->AddConfig("Attenuation", 0.9);//衰变系数
//tlo->AddConfig("Direction", "0,0, 0.0, -1.0");//光线方向设置
//tlo->AddConfig("Position", "20,30,40,1.0");//光线位置设置 (x, y, z,w)
tlo->AddConfig("LayerID","-1");//添加图层id, 若值设置为 -1 则光线将对场景相机进行操作
operationPtr->UpdateOperationOptions(tlo);//更新操作
}
//修改光线
void Cf5c2LightDlg::OnBnClickedupdatechangelightoption()
{
if(!operationPtr)
{
return;
}
ConfigOptionsCOMLib::IOperationOptionPtr tlo = map->CreateOperationOptions("Light");//创建更新配置对象
tlo->AddConfig("OptionsTypeName", "LightOptions");//更新操作类型。LightOptions代表光线更新
tlo->AddConfig("Operation", "Change");//操作类型。Add-添加;Change-修改;Remove-移除
tlo->AddConfig("Ambient", "0.0,1.0,0.0,1.0");//环境光
tlo->AddConfig("LayerID", "-1");//添加图层id, 若值设置为 -1 则光线将对场景相机进行操作
operationPtr->UpdateOperationOptions(tlo);//更新操作
}
//删除光线
void Cf5c2LightDlg::OnBnClickedupdateremovelightoption()
{
if(!operationPtr)
{
return;
}
ConfigOptionsCOMLib::IOperationOptionPtr tlo = map->CreateOperationOptions("Light");//创建更新配置对象
tlo->AddConfig("OptionsTypeName", "LightOptions");//更新操作类型。LightOptions代表光线更新
tlo->AddConfig("Operation", "Remove");//操作类型。Add-添加;Change-修改;Remove-移除
tlo->AddConfig("LayerID", "-1");//添加图层id, 若值设置为 -1 则光线将对场景相机进行操作
operationPtr->UpdateOperationOptions(tlo);//更新
}
//移除更新操作
void Cf5c2LightDlg::OnBnClickedremoveupdateoperation()
{
if(!operationPtr)
{
return;
}
map->RemoveOperation(operationPtr);//移除更新对象
operationPtr = NULL;
}
//***************** 光线开关设置 **************************
BaseObjectCOMLib::IOperationObjectPtr LightingOperation = NULL;
//创建更新操作
void Cf5c2LightDlg::OnBnClickedCreatelighting()
{
if ( NULL == LightingOperation ) {
ConfigOptionsCOMLib::IOperationOptionPtr tlo = map->CreateOperationOptions("Lighting");//创建更新配置对象
tlo->AddConfig("OptionsTypeName", "LightingOptions");//更新操作类型。LightingOptions代表光线开关更新
tlo->AddConfig("LayerID", "-1");//添加图层id, 若值设置为 -1 则光线将对场景相机进行操作
tlo->AddConfig("IsOpen", "true"); //是否开启。默认false-关闭
//操作类型添加
LightingOperation = map->CreateOperation("LightingOperation", tlo); //创建更新对象。LightingOperation代表光线开关更新
map->AddOperation(LightingOperation);//添加更新对象
}
}
//开启
void Cf5c2LightDlg::OnBnClickedOpenlighting()
{
if ( NULL != LightingOperation ){
ConfigOptionsCOMLib::IOperationOptionPtr tlo = map->CreateOperationOptions("Lighting");//创建更新配置对象
tlo->AddConfig("OptionsTypeName", "LightingOptions");//更新操作类型。LightingOptions代表光线开关更新
tlo->AddConfig("IsOpen", "true"); //是否开启。默认false-关闭
LightingOperation->UpdateOperationOptions(tlo); //更新操作
}
}
//关闭
void Cf5c2LightDlg::OnBnClickedCloselighting()
{
if ( NULL != LightingOperation ){
ConfigOptionsCOMLib::IOperationOptionPtr tlo = map->CreateOperationOptions("Lighting");//创建更新配置对象
tlo->AddConfig("OptionsTypeName", "LightingOptions");//更新操作类型。LightingOptions代表光线开关更新
tlo->AddConfig("IsOpen", "false"); //是否开启。默认false-关闭
LightingOperation->UpdateOperationOptions(tlo); //更新操作
}
}
//移除光线开关
void Cf5c2LightDlg::OnBnClickedRemovelightingoption()
{
if( NULL != LightingOperation ) {
map->RemoveOperation(LightingOperation); //移除操作
LightingOperation = NULL;
}
}
C#调用
IOperationObject operationPtr;//光线操作对象
private void createUpdateOperations_Click(object sender, EventArgs e)
{
if (null == operationPtr)
{
IOperationOption tlo = map.CreateOperationOptions("Light");//创建更新配置对象
tlo.AddConfig("OptionsTypeName", "LightOptions");//更新操作类型。LightOptions代表光线更新
tlo.AddConfig("Ambient", "0.9,0.0,0.0,1.0");//环境光
tlo.AddConfig("Operation", "Add");//操作类型。Add-添加;Change-修改;Remove-移除
tlo.AddConfig("LayerID", "-1");//添加图层id, 若值设置为-1则光线将对场景相机进行操作
operationPtr = map.CreateOperation("LightOperation", tlo);//创建更新对象。LightOperation代表光线更新
map.AddOperation(operationPtr);//添加更新对象
}
else
{
MessageBox.Show("请勿重复创建更新操作!");
}
}
//添加光线
private void updateAddLightOption_Click(object sender, EventArgs e)
{
if (null != operationPtr)
{
IOperationOption tlo = map.CreateOperationOptions("Light");//创建更新配置对象
tlo.AddConfig("OptionsTypeName", "LightOptions");//更新操作类型。LightOptions代表光线更新
tlo.AddConfig("Ambient", "0.0,0.0,0.5,1.0");//环境光
tlo.AddConfig("Operation", "Add");//操作类型。Add-添加;Change-修改;Remove-移除
/**以下注释配置项,需要时打开*/
//tlo.AddConfig("Diffuse", "1.0,1.0,1.0,1");//漫反射光
//tlo.AddConfig("Specular", "1.0,1.0,1.0,1");//镜面光
//tlo.AddConfig("SpotCutOff",180.0);//光源的最大散布角
//tlo.AddConfig("SpotExponet", 2.0);//聚光源指数
//tlo.AddConfig("Attenuation", 0.9);//衰变系数
//tlo.AddConfig("Direction", "0,0, 0.0, -1.0");//光线方向设置
//tlo.AddConfig("Position", "20,30,40,1.0");//光线位置设置 (x, y, z,w)
tlo.AddConfig("LayerID", "-1");//添加图层id, 若值设置为 -1 则光线将对场景相机进行操作
operationPtr.UpdateOperationOptions(tlo);//更新操作
}
else
{
MessageBox.Show("不存在更新操作对象,无法更新!");
}
}
//修改光线
private void updateChangeLightOption_Click(object sender, EventArgs e)
{
if (null != operationPtr)
{
IOperationOption tlo = map.CreateOperationOptions("Light");//创建更新配置对象
tlo.AddConfig("OptionsTypeName", "LightOptions");//更新操作类型。LightOptions代表光线更
tlo.AddConfig("Operation", "Change");//操作类型。Add-添加;Change-修改;Remove-移除
tlo.AddConfig("Ambient", "0.0,1.0,0.0,1.0");//环境光
tlo.AddConfig("LayerID", "-1");//添加图层id, 若值设置为 -1 则光线将对场景相机进行操作
operationPtr.UpdateOperationOptions(tlo);//更新操作
}
else
{
MessageBox.Show("不存在更新操作对象,无法更新!");
}
}
//删除光线
private void updateRemoveLightOption_Click(object sender, EventArgs e)
{
if (null != operationPtr)
{
IOperationOption tlo = map.CreateOperationOptions("Light");//创建更新配置对象
tlo.AddConfig("OptionsTypeName", "LightOptions");//更新操作类型。LightOptions代表光线更新
tlo.AddConfig("Operation", "Remove");//操作类型。Add-添加;Change-修改;Remove-移除
tlo.AddConfig("LayerID", "-1");//添加图层id, 若值设置为 -1 则光线将对场景相机进行操作
operationPtr.UpdateOperationOptions(tlo);//更新
}
else
{
MessageBox.Show("不存在更新操作对象,无法更新!");
}
}
//移除更新操作
private void removeUpdateOperation_Click(object sender, EventArgs e)
{
if (null != operationPtr)
{
map.RemoveOperation(operationPtr);//移除更新对象
operationPtr = null;
}
else
{
MessageBox.Show("不存在更新操作对象,请勿重复删除!");
}
}
//***************** 光线开关设置 **************************
IOperationObject LightingOperation = null;
//创建更新操作
private void CreateLighting_Click(object sender, EventArgs e)
{
if (null == LightingOperation)
{
IOperationOption tlo = map.CreateOperationOptions("Lighting");//创建更新配置对象
tlo.AddConfig("OptionsTypeName", "LightingOptions");//更新操作类型。LightingOptions代表光线开关更新
tlo.AddConfig("LayerID", "-1");//添加图层id, 若值设置为 -1 则光线将对场景相机进行操作
tlo.AddConfig("IsOpen", "true"); //是否开启。默认false-关闭
//操作类型添加
LightingOperation = map.CreateOperation("LightingOperation", tlo); //创建更新对象。LightingOperation代表光线开关更新
map.AddOperation(LightingOperation);//添加更新对象
}
}
//开启
private void OpenLighting_Click(object sender, EventArgs e)
{
if (null != LightingOperation)
{
var tlo = map.CreateOperationOptions("Lighting");//创建更新配置对象
tlo.AddConfig("OptionsTypeName", "LightingOptions");//更新操作类型。LightingOptions代表光线开关更新
tlo.AddConfig("IsOpen", "true"); //是否开启。默认false-关闭
LightingOperation.UpdateOperationOptions(tlo); //更新操作
}
}
//关闭
private void CloseLighting_Click(object sender, EventArgs e)
{
if (null != LightingOperation)
{
var tlo = map.CreateOperationOptions("Lighting");//创建更新配置对象
tlo.AddConfig("OptionsTypeName", "LightingOptions");//更新操作类型。LightingOptions代表光线开关更新
tlo.AddConfig("IsOpen", "false"); //是否开启。默认false-关闭
LightingOperation.UpdateOperationOptions(tlo); //更新操作
}
}
//移除光线开关
private void RemoveLightingOption_Click(object sender, EventArgs e)
{
if (null != LightingOperation)
{
map.RemoveOperation(LightingOperation); //移除操作
LightingOperation = null;
}
}