2018-11-15 17:21:01 xiaoxiaolooi 阅读数 266
  • 从这里开始虚幻4-第2辑-蓝图 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2264 人正在学习 去看看 杨石兴

unreal GIS 模块

unreal4 源代码模块

自从unreal4 开源以来,osg ogre 渐渐不能用来吃饭,于是本着听人劝吃饱饭的思想,转头unreal门下,继续为混口饭事业,投身革命。可是unreal的c++编程基本没有什么例子可看,只好自己从头做起。

  1. 开发者驱动
  2. 编辑器
  3. 工程目录
  4. 基础框架代码
  5. 第三方库

在这里插入图片描述
这个是文档目录,代码量难以阅读,决定从以下三方向入手,第一次写文字,真心不容易。
1.案例编写使用unreal4 的普通界面搭建自定义三维场景 介绍 editor层的基础代码
2.添加GIS地图属性信息 介绍 驱动层的基础代码
3.程序化植物合成 介绍 与unreal基础平台结合
以后会陆续跟新到这里
推荐大家使用 阿里云 https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=ic4sfgeu

2017-06-11 20:00:05 Allen7474 阅读数 905
  • 从这里开始虚幻4-第2辑-蓝图 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2264 人正在学习 去看看 杨石兴

                                                001 创建森林地面


    这里开始的时候我们需要在UE4商店中下载一个叫做Infinty Blade:Grass Lands的工程文件,和一个KiteDemo的工程文件。

                          本地购物车。

     里面包含了所需要用到的模型材质等资源。



              -----------------------我是笔记开始分割线---------------------------



     开始时我们只需要创建一个场景利用里面的场景进行地形材质的创建与修改。

     将我们下载好的两个工程文件导入这个新建的工程文件中。


        在KiteDemo下KiteDemo\Environments\GroundTiles\Grass

找到M_AssetPlatform_Grass的文件,进行复制,然后移动到自己的目录结构中,进行二次修改。




复制并转移文件位置,放到自己的项目结构中。


然后双击打开材质进行编辑。


     打开之后可以看到各种节点,比较混乱,这个时候我们可以先整理一下让自己开起来不是那么混乱,也可以顺一下,看看他的逻辑。

   





这里我标注了一下,以模块的形式来看。

1、是设置贴图的精度的部分

2、是各种贴图的部分

3、是通过RGBA(也就是红,绿,蓝,透明度)地形画刷刷地形的部分

4、5、6、7、都属于数学运算,这里的部分可以查阅文档。

http://docs.unrealengine.com/latest/CHN/Engine/Rendering/Materials/ExpressionReference/Math/index.html


   这里我们需要再次选中两组贴图,拖放进材质编辑器中。

  















这里只用到了Lerp的数学算法,<线性叠加>

这里的Lerp创建可以点L键,然后鼠标左键进行创建。


标记为1的是为贴图服务的,

标记为2的是为法线贴图服务的,






这里的TexCoord是控制贴图精度的,所以,放在贴图,和法线贴图之前来进行管理精度。


这里的数值越大,精度越大,反之越小。



这里我们就可以利用地形画刷为地形刷地。





这里简单说一下地形画刷中功能。





1、这里红色箭头是油漆桶工具,可以为地形刷最基础的贴图,很方便。

2、这里绿色箭头是切换工具,这里是控制紫色箭头所指的内容,这个机制简单说就是利用黑白,切换同一个颜色下画刷的不同。

3、绿色箭头就是之前说的利用RGBA和绿色箭头内容,控制贴图的变换(与Lerp有关).

4、黄色箭头指的是控制画刷的属性,可查阅官方文档。



这里是完成地形材质,画上去的效果。




但是这里的画刷切换是有覆盖性的,所以理解之后,画起来会方便许多。




------------------------------我是分割线---------------------------------


这里有个补充一个知识点。






这里可以看出来画刷刷出来的地形,变高了,是因为材质中的偏移量控制,如图。












2019-10-29 00:40:57 qq_45416021 阅读数 83
  • 从这里开始虚幻4-第2辑-蓝图 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2264 人正在学习 去看看 杨石兴

现象 :局部黑面或者漏光:

解决方法1:模型属性general settings>【light map resolution】 相应提高  世界设置>lightmass>【Static lighting level 】 值越低精度越高。烘焙级别为【产品级】

解决方法2:重新展开lightmap UV 更加合理一些。UV整体与象限边界之间留出空隙。

直接现象:烘焙后整个黑面

附加现象1:导致的第一个问题,三维中法线是向内的,但是到了unreal 中法线表现就反了,而且镜像复制的模型即使反转法线也无法正常渲染

附加现象2:导致烘焙结果相反且出现整个黑面。且mesh预览缩略图为暗色。

附加现象3:导致max模型坐标是相反的,反向坐标导出就会 造成错误。

推论:因为镜像复制导致空间坐标出错,纠正即可。镜像复制的模型甚至会造成贴图导出到SP表现错误,所以模型完成后要记得修正镜像模型的坐标空间。

解决方法

1. 不处理镜像模型,只导出原模型(如果有原模型)。

2.【重置变换】+【反转法线】纠正物体的 变换属性然后再导出到unreal中,此时便没有上述的任何问题,烘焙结果正确。

2015-11-12 10:45:16 xi_niuniu 阅读数 1557
  • 从这里开始虚幻4-第2辑-蓝图 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2264 人正在学习 去看看 杨石兴



因为新建空场景中没有添加任何光源,为了在未添加光源之前方便查看添加到场景中的游戏物体,可以设置以下选项




调整大小做为地面


添加材质


添加石头物体


添加光源需要把 “不带光照” 调整为 “带光照”



播放查看效果


这时石头物体没有添加 Collision 所以在游戏运行时摄像机是可以穿入物体内部的

接下来为这些物体添加 Collision

Collision volumes有一些不同的类型,通常mesh-mesh collision 是比较完美的碰撞体,但是在运行时过于消耗性能。

There are a few different types of collision volumes. Generally, perfect mesh-mesh
collisions are way too expensive to do at runtime. Instead, we use an approximation
(a bounding volume) to guess the collision volume.

"内容出自 《Learning C++ by Creating Games with UE4》"






完成之后在游戏运行状态下,这些物体就无法再被摄像机“穿透”了



2016-09-06 15:33:12 sgnyyy 阅读数 762
  • 从这里开始虚幻4-第2辑-蓝图 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2264 人正在学习 去看看 杨石兴
// .h 文件
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "GameFramework/Actor.h"
#include "Avatar.h"
#include "MyHUD.h"

#include "PickupItem.generated.h"


UCLASS()
class HOWTO_CPPPLAYERINPUT_API APickupItem : public AActor
{
	GENERATED_BODY()
	
public:
    
    // The name of the item we are getting
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Item)
    FString Name;
    
    // How much you are getting
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Item)
    int32 Quantity;
    
    // the sphere you collide with to pick item up
    UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category =  Item)
    USphereComponent* ProxSphere;
    
    UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category =  Item)
    UStaticMeshComponent * Mesh;
    
    // The icon that represents the object in UI/canvas
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Item)
    UTexture2D* Icon;
    
    // When something comes inside ProxSphere, this function runs
    UFUNCTION(BlueprintNativeEvent, Category = Collision)
    void Prox( UPrimitiveComponent* HitComp,  AActor* OtherActor,  UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult );

	// Sets default values for this actor's properties
	APickupItem();

	// Called when the game starts or when spawned
	virtual void BeginPlay() override;
	
	// Called every frame
	virtual void Tick( float DeltaSeconds ) override;
};

// .cpp文件
// Fill out your copyright notice in the Description page of Project Settings.

#include "HowTo_CppPlayerInput.h"
#include "PickupItem.h"


// Sets default values
APickupItem::APickupItem()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

    Name = "UNKNOWN ITEM";
    Quantity = 0;
    
    ProxSphere = CreateDefaultSubobject<USphereComponent>(TEXT("ProxSphere"), false);
    Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"), false);
    
    // make the root object the Mesh
    RootComponent = Mesh;
    ProxSphere->AttachToComponent( Mesh, FAttachmentTransformRules::KeepRelativeTransform );
    
    Mesh->SetSimulatePhysics(true);
    // Code to make APickupItem::Prox() run when this
    // object's proximity sphere overlaps another actor.
    ProxSphere->OnComponentBeginOverlap.AddDynamic(this, &APickupItem::Prox);  // very important!
}

void APickupItem::Prox_Implementation(UPrimitiveComponent* HitComp,  AActor* OtherActor,  UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)
{
    // if the overlapped actor is NOT the player,
    // you simply should return
    if( Cast<AAvatar>( OtherActor ) == nullptr )
    {
        return;
    }
    // Get a reference to the player avatar, to give him
    // the item
    AAvatar *avatar = Cast<AAvatar>(  UGameplayStatics::GetPlayerPawn(GetWorld(), 0 ) );
    // Let the player pick up item
    // Notice use of keyword this!
    // That is how _this_ Pickup can refer to itself.
    avatar->Pickup( this );
    // Get a reference to the controller
    APlayerController* PController = GetWorld()->GetFirstPlayerController();
    // Get a reference to the HUD from the controller
    AMyHUD* hud = Cast<AMyHUD>( PController->GetHUD() );
    hud->addMessage( Message( Icon, FString("Picked up ") + FString::FromInt(Quantity) + FString(" ") + Name, 5.f, FColor::White) );
    Destroy();
}

// Called when the game starts or when spawned
void APickupItem::BeginPlay()
{
	Super::BeginPlay();
	
}

// Called every frame
void APickupItem::Tick( float DeltaTime )
{
	Super::Tick( DeltaTime );

}


Unreal里的输入

阅读数 1212

unreal

阅读数 243

没有更多推荐了,返回首页