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;
    }
}

results matching ""

    No results matching ""