2D中如何判断一点在另一个点的那个方位

本文介绍了一种快速判断平面上一点相对于另一点方位的算法。该方法仅需比较坐标值,无需复杂的向量运算,适用于屏幕坐标系下快速定位点的位置。

  在工作中经常遇到判断一个点在另一个点的那个方位的问题,如下图,这里需要确定p2在p1的那个方位,也就是求p2相对于p1落在区域1,2,3,4那个中,注意此处p1不是坐标原点,坐标原点在屏幕的左上角(此处为屏幕坐标)。这个问题的解决方法有很多,可以使用向量夹角来做,使用该夹角的方法涉及到向量的乘除,速度上会有影响。此处给出的方法只需判断点的坐标值即可。

  具体算法描述如下:

  1.将p1,p2转换为以p1为坐标原点,也即平移坐标系。上图给出的就是转换后的坐标系

  2.由上图可以看出:

     区域1中有:|x| > |y|, x > 0

     区域2中有:|x| < |y|, y < 0

     区域3中有:|x| > |y|, x < 0

     区域4中有:|x| < |y|, y > 0

 

  代码如下:

 

  总结:通过该方法可以判断其它区域的情况,只需将判断条件修改一下即可

<think>好的,用户之前问过如何在UE4中使用滑块控制色温、色调、曝光和饱和度,现在他想要更详细的步骤,包括节点的具体位置和切换方法。我需要仔细回顾之前的回答,看看哪里可以补充更多细节。 首先,用户提到“位置切换”可能是指材质节点的连接位置或者UMG中的布局。需要明确每个参数在材质中的具体节点位置,以及如何在UMG中安排滑块的位置。 在之前的回答中,创建后期材质的步骤可能不够详细。用户现在需要知道每个参数对应的具体节点,比如色温用哪个节点,色调怎么处理。可能需要具体说明SceneTexture连接到哪个节点,Temperature和Tint节点的位置,以及如何通过Multiply和Saturation节点调整曝光和饱和度。 外,用户可能对参数暴露的具体步骤不清楚,比如如何在材质中创建标量参数并命名,然后如何在UMG中绑定这些参数。需要详细说明在材质图表中如何右键创建参数,设置默认值,以及如何在蓝图中使用Set Scalar Parameter Value节点。 关于位置切换,可能需要解释如何在UMG中布局四个滑块,比如使用垂直框或网格面板来排列,以及如何设置每个滑块的取值范围和默认位置。比如色温滑块范围是1000到15000,而色调是-1到1,这些都需要明确说明。 用户还可能对动态控制逻辑有疑问,比如如何在PlayerController中创建控件实例,如何获取PostProcessVolume,并确保材质实例正确应用。需要补充如何通过蓝图获取所有后期处理体积,并确保材质实例被正确添加。 外,可能需要检查是否有遗漏的步骤,比如后期处理体积的设置是否要勾选“无限范围”,以及如何确保材质在体积中的正确应用。还有,是否需要在关卡蓝图中初始化控件,或者如何在游戏开始时显示UMG界面。 用户可能还希望了解如何处理多个后期处理体积的情况,比如如何确保滑块控制的是正确的体积,或者如何混合多个体积的参数。不过根据问题,可能暂时不需要深入这部分,除非用户特别提到。 最后,确保回答中的代码示例和节点名称准确,比如在蓝图中调用Set Scalar Parameter Value的正确方法,以及如何在事件图表中绑定滑块的值变化事件。可能需要提供更详细的蓝图截图或步骤,但由于是文本,需用文字描述清楚。 总结需要补充的细节:材质节点的具体连接步骤,参数暴露的详细操作,UMG布局的具体设置,滑块事件绑定的蓝图节点,以及动态获取后期处理体积的方法。同时,确保每个步骤都明确节点名称和位置,避免用户混淆。</think>以下是UE4中使用滑块控制画面参数的详细实现流程,包含节点位置和参数切换的具体操作: --- ### 一、材质系统配置(节点级操作) 1. **创建主材质** - 新建`Material`命名为`M_PostProcess_ColorControl` - 材质域选择 **Post Process** - 勾选`Use Material Attributes` 2. **核心节点布局**(按F快捷键搜索节点) ```typescript [SceneTexture:PostProcessInput0] → [MaterialAttributes] → [BreakMaterialAttributes] → [Custom节点处理逻辑] → [MakeMaterialAttributes] → [输出到Emissive] ``` 3. **参数控制节点** - **色温控制**: ```mathematica [SceneTexture] → [TemperatureAndTint]节点 ↓ Temp参数(5500) → [Temperature]输入 Tint参数(0.0) → [Tint]输入 ``` - **曝光控制**: ```mathematica [TemperatureAndTint输出] → [Multiply] ↑ Exposure参数(1.0) → [值输入] ``` - **饱和度控制**: ```mathematica [Multiply输出] → [Desaturation]节点 ↑ Saturation参数(1.0) → [Fraction输入] ``` 4. **参数暴露**(右键创建): - 标量参数:`Temp`/`Tint`/`Exposure`/`Saturation` - 设置默认值: ```typescript Temp: 5500 (色温白平衡基准值) Tint: 0.0 (中性色调) Exposure: 1.0 (无增益) Saturation: 1.0 (标准饱和度) ``` ![材质节点示意图](https://via.placeholder.com/800x400?text=PostProcess+Material+Node+Structure)[^1] --- ### 二、UMG控件搭建(位置切换实现) 1. **控件层级结构**: ```yaml CanvasPanel ├─ VerticalBox_Controls │ ├─ Slider_Temp (位置:X=200,Y=80) │ ├─ Slider_Tint (位置:X=200,Y=160) │ ├─ Slider_Exposure (位置:X=200,Y=240) │ └─ Slider_Saturation (位置:X=200,Y=320) └─ TextBlock_Labels... ``` 2. **滑块属性设置**: | 参数 | Value Range | Default Value | |---|---|---| | 色温 | 1000-15000 | 5500 | | 色调 | -1.0-1.0 | 0.0 | | 曝光 | 0.1-5.0 | 1.0 | | 饱和度 | 0.0-3.0 | 1.0 | 3. **事件绑定**(蓝图示例): ```cpp // 在Widget蓝图中: void OnTempChanged(float Value) { if(MI_PostProcess) MI_PostProcess->SetScalarParameterValue(FName("Temp"), Value); } ``` --- ### 三、运行时逻辑(位置切换关键) 1. **动态加载材质实例**: ```cpp // 在关卡蓝图中: UMaterialInstanceDynamic* MI_PostProcess = UMaterialInstanceDynamic::Create(M_PostProcess_ColorControl, this); PostProcessVolume->Settings.Blendables.Add(MI_PostProcess); ``` 2. **控件位置动态调整**: ```cpp // 在PlayerController中: UUserWidget* ControlWidget = CreateWidget<UUserWidget>(this, ControlWidgetClass); ControlWidget->AddToViewport(); ControlWidget->SetPositionInViewport(FVector2D(50, 100)); // 屏幕坐标定位 ``` 3. **多参数切换保护**: ```cpp // 使用Map存储参数状态 TMap<FName, float> PostProcessParams; void UpdateParam(FName ParamName, float Value) { if(PostProcessParams.Contains(ParamName)) { PostProcessParams[ParamName] = FMath::Clamp(Value, MinRange, MaxRange); MI_PostProcess->SetScalarParameterValue(ParamName, PostProcessParams[ParamName]); } } ``` --- ### 四、调试技巧 1. **实时预览**:在材质编辑器中启用`Live Preview`模式 2. **参数快照**:使用`Take Highres Screenshot`命令对比调节效果 3. **控制台命令**: ```bash r.PostProcessing.PropagateAlpha 1 # 强制更新后期参数 ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值