2.6.5 模型纹理替换


模型纹理替换

模型纹理替换是指替换场景内人工模型的纹理贴图效果。

在进行模型纹理替换时,需要传入目标对象所在的图层ID,以及可以相交到目标对象的坐标位置。一般可以通过模型拾取操作 获取到坐标位置和图层ID。也可以直接传入坐标位置和图层ID。

模型纹理替换主要包括添加(创建)、更新和删除3种操作。

下图是模型纹理替换效果:

  

参数说明

模型纹理替换可配置的参数如下表所示:

配置项 配置说明 值类型 备注
OptionsTypeName 操作配置项类名 string TextureOptions代表模型纹理更新
LonCoord 经度坐标 double 相交位置的经度坐标
LatCoord 纬度坐标 double 相交位置的纬度坐标
HCoord 高程坐标 double 相交位置的高程坐标
ImagePath 图片路径 string 需更更换的纹理图片路径
LayersID 作用图层ID int列表 传-1则默认对所有图层起效,若为多个图层,可使用xx,xx,xx
此种格式。图层Id可以通过图层对象的GetLayerId()方法获取

代码调用示例

Javascript调用

var operationPtr;
var isRemove = false;
var pickResponser = null;
var responseStr = null;
var resEvent = null;
//回调实现函数
function callBackFunRes(respType, notifyType){
    if(pickResponser){
        responseStr = pickResponser.GetResponserResult().GetConfigValueByKey("PickPointList"); //获取拾取相交点经纬度列表
    }
}
//创建模型拾取响应器
function createModelPickResponser(){
    if(pickResponser == null){
        resEvent = addEvent(obj, "FireOnResponserNotify", callBackFunRes);
        var resp = map.CreateResponserOptions("model");//创建响应器配置对象,参数任意名称
        resp.AddConfig("PickLayerIdList", gModelLayer.GetLayerID());//拾取图层Id。传-1则默认遍历所有模型图层,若为多个图层,可使用xx,xx,xx此种格式
        resp.AddConfig("PickColor", "1.0,0.0,0.0,0.5");//拾取颜色
        resp.AddConfig("IsChangeColor", "true");//是否变色
        resp.AddConfig("IsGetLayerID", "true");//是否需要获取节点所在图层ID
        pickResponser = map.CreateResponser("PickModelResponser", resp);//创建模型拾取响应器对象,第一参必须为PickModelResponser
        pickResponser.AddObserver();//添加监听
        map.AddResponser(pickResponser);//添加响应器对象
    }else{
        alert("请勿重复创建模型拾取响应器!")
    }
}
//创建创建纹理替换更新操作
function createTextureOperation(){
    if(responseStr == null){
        alert("pick point is null!");
    }else{
        map.RemoveResponser("PickModelResponser");
        pickResponser = null;
    }
    if(operationPtr == null){
        var blh = responseStr.split(",;");
        blh = blh[blh.length - 1];
        blh = blh.replace(";", "");
        var LonLatH = blh.split(",");
        var tlo = map.CreateOperationOptions("TextureOperation");//创建更新配置对象,任意名称
        tlo.AddConfig("ImagePath", gIconFolderPath + "/water_bump.jpg"); //设置纹理图片路径
        tlo.AddConfig("LonCoord", LonLatH[0]);//相交位置经度坐标
        tlo.AddConfig("LatCoord", LonLatH[1]);//相交位置纬度坐标
        tlo.AddConfig("HCoord", LonLatH[2]);//相交位置高度坐标
        tlo.AddConfig("LayersID", gModelLayer.GetLayerId());//作用图层Id。传-1则默认遍历所有模型图层,若为多个图层,可使用xx,xx,xx此种格式
        tlo.AddConfig("OptionsTypeName", "TextureOptions");//更新类型,TextureOptions代表纹理更新      
        operationPtr = map.CreateOperation("TextureOperation", tlo);//创建更新对象,TextureOperation代表纹理更新
        map.AddOperation(operationPtr);//添加更新对象
    }else{
        alert("更新对象已存在,创建无效!");
    }
}
//更新纹理替换更新操作
function updateTextureOption(){
    if(null != operationPtr){
        var tlo = map.CreateOperationOptions("TextureOperation");//创建更新配置对象,任意名称
        tlo.AddConfig("ImagePath", gIconFolderPath + "/water_another.jpg");//添加纹理要设置的图片
        tlo.AddConfig("LayersID", gModelLayer.GetLayerId());//添加需要拾取相交的图层id,以逗号分隔,-1 与场景相机作相交
        tlo.AddConfig("OptionsTypeName", "TextureOptions");//更新类型,TextureOptions代表纹理更新         
        operationPtr.UpdateOperationOptions(tlo);//更新更新对象
    }else{
        alert("更新对象为空,无法更新!");
    }
}
//移除纹理替换更新操作
function removeTextureOperation(){ 
    if(operationPtr){
        map.RemoveOperation(operationPtr);//移除更新对象
        operationPtr = null;
    }else{
        alert("更新对象为空,无法删除!");
    }
}

C++调用

BaseObjectCOMLib::IResponserObjectPtr pickModelResponser;//模型拾取响应器对象
BaseObjectCOMLib::IOperationObjectPtr operationPtr;//更新对象
std::string responseStr;//点位坐标

//创建模型响应器
void Cf5c4TextureReplaceDlg::OnBnClickedcreatemodelpickresponser()
{
    if(!pickModelResponser){
        ConfigOptionsCOMLib::IResponserOptionPtr resp =(ConfigOptionsCOMLib::IResponserOptionPtr)map->CreateResponserOptions("model");//创建响应器配置,参数任意名称
        resp->AddConfig("PickLayerIdList", "-1");//传-1则默认遍历所有模型图层,若为多个图层,可使用xx,xx,xx此种格式
        resp->AddConfig("PickColor", "1.0,0.0,0.0,0.5");//拾取颜色
        resp->AddConfig("IsChangeColor", "true");//是否变色
        resp->AddConfig("IsGetLayerID", "true");//是否需要获取节点所在图层ID
        pickModelResponser = map->CreateResponser("PickModelResponser", resp);//创建模型拾取响应器,第一参必须为PickModelResponser字符串
        pickModelResponser->AddObserver();    //添加监听
        map->AddResponser(pickModelResponser); //添加响应器
    }
}

//创建创建纹理替换更新操作
void Cf5c4TextureReplaceDlg::OnBnClickedcreatetextureoperation()
{
    if(responseStr.empty())
    {
        std::cout << "pick point is null!:" << std::endl;
        return;
    }
    else
    {
        map->RemoveResponser("PickModelResponser");//移除模型响应器
        pickModelResponser = NULL;
    }
    if(operationPtr)
    {
        return;
    }
    char temp_status[MAX_PATH];
    GetPrivateProfileStringA("Path", "IconFolderPath", "", temp_status, MAX_PATH, mIniPath.c_str());
    std::string ImgPath(temp_status);
    ImgPath += "/water_bump.jpg";
    //对responseStr进行处理分割
    std::vector<std::string> blh1,blh2,LonLatH,LonLatH1;
    std::string tmp;
    SplitString(responseStr,blh1,",;");
    tmp =blh1[blh1.size() - 1];
    SplitString(tmp,LonLatH,",");
    SplitString(LonLatH[2],LonLatH1,",");
    ConfigOptionsCOMLib::IOperationOptionPtr tlo = map->CreateOperationOptions("TextureOperation");//创建配置类型,操作类型的配置
    tlo->AddConfig("ImagePath",ImgPath.c_str()); //设置纹理图片路径
    tlo->AddConfig("LonCoord", LonLatH[0].c_str());//相交位置经度坐标
    tlo->AddConfig("LatCoord", LonLatH[1].c_str());//相交位置纬度坐标
    tlo->AddConfig("HCoord", LonLatH1[0].c_str());//相交位置高度坐标
    tlo->AddConfig("LayersID", "-1");//作用图层Id。传-1则默认遍历所有模型图层,若为多个图层,可使用xx,xx,xx此种格式
    tlo->AddConfig("OptionsTypeName", "TextureOptions");//更新类型,TextureOptions代表纹理更新  
    operationPtr = map->CreateOperation("TextureOperation", tlo);//创建更新对象,TextureOperation代表纹理更新
    map->AddOperation(operationPtr);//添加更新对象

}

//更新纹理替换更新操作
void Cf5c4TextureReplaceDlg::OnBnClickedupdatetextureoption()
{
    if(!operationPtr)
    {
        return;
    }
    char temp_status[MAX_PATH];
    GetPrivateProfileStringA("Path", "IconFolderPath", "", temp_status, MAX_PATH, mIniPath.c_str());
    std::string ImgPath(temp_status);
    ImgPath += "/water_another.jpg";
    ConfigOptionsCOMLib::IOperationOptionPtr tlo = map->CreateOperationOptions("TextureOperation");//创建配置类型,操作类型的配置
    tlo->AddConfig("ImagePath", ImgPath.c_str());//添加纹理要设置的图片
    tlo->AddConfig("LayersID", "-1");//添加需要拾取相交的图层id,以逗号分隔,-1 与场景相机作相交
    tlo->AddConfig("OptionsTypeName", "TextureOptions");//更新类型,TextureOptions代表纹理更新         
    operationPtr->UpdateOperationOptions(tlo);//更新更新对象
}

//移除纹理替换更新操作
void Cf5c4TextureReplaceDlg::OnBnClickedremovetextureoperation()
{
    if(!operationPtr)
    {
        return;
    }
    map->RemoveOperation(operationPtr);//移除更新对象
    operationPtr = NULL;
}

//获取拾取点坐标回调
void Cf5c4TextureReplaceDlg::FireOnResponserNotifyVpsdkctrl1(LPCTSTR respType, long notifyType)
{
    if(pickModelResponser){
        ConfigOptionsCOMLib::IResponserOptionPtr opt = pickModelResponser->GetResponserResult();
        responseStr = opt->GetConfigValueByKey("PickPointList"); //获取经纬度列表
    }
}

//字符串截取操作
void  Cf5c4TextureReplaceDlg::SplitString(const std::string& s,std::vector<std::string>& v,const std::string& c)
{
    std::string::size_type pos1,pos2;
    pos2 = s.find(c);
    pos1 = 0;
    while(std::string::npos !=pos2)
    {
        v.push_back(s.substr(pos1,pos2-pos1));
        pos1 = pos2 + c.size();
        pos2= s.find(c,pos1);
    }
    if(pos1 !=s.length())
    {
        v.push_back(s.substr(pos1));
    }
}

C#调用

string gIconFolderPath = E:\data\LocalData\Other\images;
IResponserObject pickResponser;//模型拾取响应器对象
string responseStr;//点位坐标
IOperationObject operationPtr;//更新对象
//创建模型拾取响应器
private void createModelPickResponser_Click(object sender, EventArgs e)
{
    if(pickResponser == null){
        var resp = map.CreateResponserOptions("model");//创建响应器配置对象,参数任意名称
        resp.AddConfig("PickLayerIdList", "-1");//拾取图层Id。传-1则默认遍历所有模型图层,若为多个图层,可使用xx,xx,xx此种格式
        resp.AddConfig("PickColor", "1.0,0.0,0.0,0.5");//拾取颜色
        resp.AddConfig("IsChangeColor", "true");//是否变色
        resp.AddConfig("IsGetLayerID", "true");//是否需要获取节点所在图层ID
        pickResponser = map.CreateResponser("PickModelResponser", resp);//创建模型拾取响应器对象,第一参必须为PickModelResponser
        pickResponser.AddObserver();//添加监听
        map.AddResponser(pickResponser);//添加响应器对象
    }else{
        MessageBox.Show("请勿重复创建模型拾取响应器!");
    }
}
//创建创建纹理替换更新操作
private void createTextureOperation_Click(object sender, EventArgs e)
{
    if (responseStr == null)
    {
        MessageBox.Show("pick point is null!");
    }
    else
    {
        map.RemoveResponser("PickModelResponser");
        pickResponser = null;
    }
    if (operationPtr == null)
    {
        string[] blh = Regex.Split(responseStr,",;",RegexOptions.IgnoreCase);
        var blh1 = blh[blh.Length - 1];
        var blh2 = blh1.Replace(";", "");
        var LonLatH = blh2.Split(',');
        //MessageBox.Show(LonLatH);
        var tlo = map.CreateOperationOptions("TextureOperation");//创建更新配置对象,任意名称
        tlo.AddConfig("ImagePath", gIconFolderPath+"\\water_bump.jpg"); //设置纹理图片路径
        tlo.AddConfig("LonCoord", LonLatH[0]);//相交位置经度坐标
        tlo.AddConfig("LatCoord", LonLatH[1]);//相交位置纬度坐标
        tlo.AddConfig("HCoord", LonLatH[2]);//相交位置高度坐标
        tlo.AddConfig("LayersID", "-1");//作用图层Id。传-1则默认遍历所有模型图层,若为多个图层,可使用xx,xx,xx此种格式
        tlo.AddConfig("OptionsTypeName", "TextureOptions");//更新类型,TextureOptions代表纹理更新      
        operationPtr = map.CreateOperation("TextureOperation", tlo);//创建更新对象,TextureOperation代表纹理更新
        map.AddOperation(operationPtr);//添加更新对象
    }
    else
    {
        MessageBox.Show("更新对象已存在,创建无效!");
    }
}
//更新纹理替换更新操作
private void updateTextureOption_Click(object sender, EventArgs e)
{
    if (null != operationPtr)
    {
        var tlo = map.CreateOperationOptions("TextureOperation");//创建更新配置对象,任意名称
        tlo.AddConfig("ImagePath", "F:\\svn\\测试用例提交\\CooRunSDKDemoApplication-V6.1\\data\\Other\\images\\water_another.jpg");//添加纹理要设置的图片
        tlo.AddConfig("LayersID", "-1");//添加需要拾取相交的图层id,以逗号分隔,-1 与场景相机作相交
        tlo.AddConfig("OptionsTypeName", "TextureOptions");//更新类型,TextureOptions代表纹理更新         
        operationPtr.UpdateOperationOptions(tlo);//更新更新对象
    }
    else
    {
        MessageBox.Show("更新对象为空,无法更新!");
    }
}
//移除纹理替换更新操作
private void removeTextureOperation_Click(object sender, EventArgs e)
{
    if (operationPtr != null)
    {
        map.RemoveOperation(operationPtr);//移除更新对象
        operationPtr = null;
    }
    else
    {
        MessageBox.Show("更新对象为空,无法删除!");
    }
}
//响应器回调
private void axVPSDKCtrl1_FireOnResponserNotify(object sender, AxSDKCtrlLib._IVPSDKCtrlEvents_FireOnResponserNotifyEvent e)
{
    if (pickResponser != null)
    {
        responseStr = pickResponser.GetResponserResult().GetConfigValueByKey("PickPointList"); //获取拾取相交点经纬度列表
    }
}

results matching ""

    No results matching ""