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
相关产品推荐
相关产品推荐

