You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF 3D中LinearGradientBrush结合TextureCoordinates颜色异常如何解决

问题根源

你遇到的是渐变 brush 自动适配纹理坐标范围的问题:默认情况下LinearGradientBrush的MappingMode为RelativeToBoundingBox,会自动把你输入的所有纹理坐标的最小值、最大值分别映射到渐变的0和1位置,而非用全局固定的0~1作为映射基准。
比如你当前所有z值都在010之间,算出来的坐标X值范围是00.1,系统会自动把0对应渐变Offset 0、0.1对应渐变Offset 1,所以最高的z值自然就对应了Offset=1的洋红色,和你预期的固定映射逻辑不符。

解决方案

根据你的需求选对应方案即可:

方案1:固定全局映射规则(z=10永远对应蓝色、z=100永远对应洋红色,不受当前数据范围影响)

不需要修改坐标计算逻辑,只要调整Brush的属性,禁用自动拉伸即可:

brush.MappingMode = BrushMappingMode.Absolute;
brush.Viewport = new Rect(0, 0, 1, 1);
brush.ViewportUnits = BrushMappingMode.Absolute;
brush.TileMode = TileMode.None;

方案2:动态适配当前数据范围(当前数据的最小z对应渐变左端、最大z对应渐变右端)

先统计本次所有z值的极值,再做归一化计算:

// 先拿到所有z值的最小、最大值
double minZ = allZValues.Min();
double maxZ = allZValues.Max();
double range = maxZ - minZ;
// 每个z值的坐标计算逻辑改为
double mappedX = range == 0 ? 0.5 : (z_value - minZ) / range;
// 可选:限制不会超出渐变范围
mappedX = Math.Clamp(mappedX, 0, 1);
textureCoordinates.Add(new Point(mappedX, 0));

内容的提问来源于stack exchange,提问作者wannensn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:45:05