跳至主要內容
aigc

概述

一、AIGC 的核心定义

AIGC = 人类提供需求 + AI自动生成内容

例如:

人类输入 AI生成
写一篇科幻小说 AI生成完整故事
输入提示词 AI生成图片
上传角色图 AI生成动画视频
描述音乐风格 AI生成音乐

Mr.Si大约 1 分钟aigcaigc
aigc|镜头语言

镜头语言(Cinematic Language)

是通过摄影机的构图、镜头运动、景别、角度、光影等视觉手段,将创作者的叙事意图、情绪表达和信息传递给观众的视觉表达体系。


视觉叙事的四个层级

1.故事(Stroy)

例如

一个年轻程序员加班到深夜,毫无灵感。
朋友打来电话邀请他打游戏,
他犹豫后决定放松一下,结果一夜未眠。

Mr.Si大约 12 分钟影视基础分镜设计分镜镜头语言影视基础AI视频
aigc|光影交织

从灯光开始

  1. 固定管线时代: 在早期的游戏引擎中,使用固定管线图形渲染流水线。灯光通常是基于简单的光照模型,如冯·肖定律(Phong Shading)等。这种方法的计算相对简单,但在细节和真实感方面表现一般。

  2. 可编程管线和着色器: 随着可编程图形管线的出现,引擎可以更灵活地处理灯光。开发者可以使用自定义的着色器编写更复杂的光照算法,如基于物理的渲染(Physically Based Rendering,PBR)。PBR模型更准确地模拟了真实世界中光的反射和折射。

  3. 实时光照技术: 引擎开始引入实时光照技术,如实时全局光照(Real-Time Global Illumination)和实时阴影技术。这些技术旨在模拟真实世界中的光照效果,提高场景的真实感。包括屏幕空间反射(Screen Space Reflection)和环境遮挡(Ambient Occlusion)等技术。

  4. 实时光追: 随着硬件性能的提升,一些引擎引入了实时光追技术,这种技术通过模拟光线在场景中的传播来实现更高质量的光照效果。实时光追通常需要更强大的计算资源,但可以提供更真实的光照和阴影。

  5. 深度学习和实时渲染: 最近,深度学习技术开始应用于游戏渲染,例如基于机器学习的超分辨率技术、反走样和实时光照估计等。这些技术旨在通过神经网络等方法改善实时渲染的质量和性能。


Mr.Si大约 4 分钟影视基础分镜设计
ED12.EdGraph|自定义Node/Pin外观

需求

FGraphPanelNodeFactory

UEdGraphNode   ——(NodeFactory)——>   SGraphNode
数据节点                UI节点
  • UEdGraphNode = 编辑器数据节点(逻辑层)
  • SGraphNode = 视觉层 Slate Widget(长什么样)
  • FGraphPanelNodeFactory = 决定这个节点显示成什么样

Mr.Si大约 1 分钟u++
ED11.EdGraph|Comment注释节点

UEdGraphNode_Comment

二、实现步骤

1 新建FEdGraphSchemaAction


2 UEdGraphSchema派生类中重写注释GetCreateCommentAction节点

 virtual TSharedPtr<FEdGraphSchemaAction> GetCreateCommentAction() const override
 {
 return TSharedPtr<FEdGraphSchemaAction>(static_cast<FEdGraphSchemaAction*>(new FComboSchemaAction_AddComment));
 }

Mr.Si大约 2 分钟u++
F23.Blueprintable|TimeHandle定时任务

导言

在UE5中,往往有一些定时的需求,比如一段时间内开启护盾(当然这里咱们不考虑使用GAS的GE等效果来实现),这时候往往需要自己设定一个定时器, 给定一个时间用来开启关闭特效。

实现

UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="DoodleJump")
bool bHasShield = false;

UFUNCTION()
void RemoveShield();	
	
void ADoodleJumpCharacter::GenerateShield_Implementation(float Time)
{
	
	// 如果之前没有护盾才播放护盾开启特效
	if (!bHasShield)
	{
		ShowShieldEffect(true);
	}

	bHasShield = true;

	// 重置计时器(重新计时 / 延长)
	GetWorldTimerManager().ClearTimer(ShieldTimerHandle);

	GetWorldTimerManager().SetTimer(
		ShieldTimerHandle,
		this,
		&ADoodleJumpCharacter::RemoveShield,
		Time,
		false
	);

	UE_LOG(LogTemp, Log, TEXT("Shield %s for %.2f seconds"),
		bHasShield ? TEXT("extended") : TEXT("activated"),
		Time);
}
void ADoodleJumpCharacter::RemoveShield()
{
	bHasShield = false;

	ShowShieldEffect(false);

	UE_LOG(LogTemp, Log, TEXT("Shield Expired"));
}


Mr.Si小于 1 分钟u++
EXP14.单向跳跃平台(碰撞体积)

提要

响应通道(Collision Response Channels)


UE 的碰撞系统由三部分组成:

  1. 碰撞通道(Collision Channel)

    • 用于标记对象所属类型。

    • UE 内置两种类型:

      • Object Channels(对象通道):标记对象类别,比如 PawnWorldStaticWorldDynamic
      • Trace Channels(射线通道):用于射线/扫描(LineTrace、SphereTrace)检测。

Mr.Si大约 6 分钟u++
EXP13.无光模式

问题描述

	// 设置光照模式
	UFUNCTION(BlueprintCallable)
	void SetViewMode(EViewModeIndex ViewMode) {
	ApplyViewMode(ViewMode, false, GEngine->GameViewport->EngineShowFlags);
	GEngine->GameViewport->ViewModeIndex = ViewMode;
}

Mr.Si小于 1 分钟u++
Umg.UI焦点问题

UI焦点问题

导言

最近在做道具轮盘,大致流程是按下某个按键,弹出一个轮盘,使用鼠标或者手柄来选择某个插槽。 本篇记录一下实现中的一些坑。

实现原理


FVector2D URadialWheelWidget::GetWheelCenterPosition()
{
	if (!WheelOverlay)
	{
		return FVector2D::ZeroVector;
	}

	// 获取 Overlay 的几何信息
	const FGeometry& Geometry = WheelOverlay->GetCachedGeometry();

	// 本地中心点
	const FVector2D LocalCenter = Geometry.GetLocalSize() * 0.5f;

	// 转换到绝对屏幕坐标
	FVector2D PixelPosition;
	FVector2D ViewportPosition;
	USlateBlueprintLibrary::LocalToViewport(this, Geometry, LocalCenter, PixelPosition, ViewportPosition);

	// 加上DPI缩放
	return ViewportPosition * UWidgetLayoutLibrary::GetViewportScale(this);
}
void URadialWheelWidget::CalcAngleAndDistanceFromDir(const FVector2D& Dir, float& OutAngle, double& OutDistance) const
{
	OutDistance = Dir.Size();

	if (!Dir.IsNearlyZero())
	{
	    // Y 翻转
		OutAngle = FMath::RadiansToDegrees(FMath::Atan2(Dir.Y, Dir.X)) + 90.f;
		OutAngle = FRotator::ClampAxis(OutAngle);
	}
	else
	{
		OutDistance = 0.0;
		OutAngle = 0.f;
	}
}
FVector2D URadialWheelWidget::GetMousePosition()
{
    float Angle = 0.f;
	double Distance = 0.0;

	//1. 获取鼠标在屏幕中的绝对位置(考虑DPI缩放)
	const FVector2D MousePos = UWidgetLayoutLibrary::GetMousePositionOnViewport(this) *
							UWidgetLayoutLibrary::GetViewportScale(this);
    //2.获取轮盘中心坐标
	const FVector2D Center = GetWheelCenterPosition();
    //3.计算偏移向量
	const FVector2D Dir = MousePos - Center;
	
	//4.计算角度和距离
	CalcAngleAndDistanceFromDir(Dir, Angle, Distance);
}
	

Mr.Si大约 1 分钟unreal