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"); //获取拾取相交点经纬度列表
}
}