x

Search in
Sort by:

Question Status:

Search help

  • Simple searches use one or more words. Separate the words with spaces (cat dog) to search cat,dog or both. Separate the words with plus signs (cat +dog) to search for items that may contain cat but must contain dog.
  • You can further refine your search on the search results page, where you can search by keywords, author, topic. These can be combined with each other. Examples
    • cat dog --matches anything with cat,dog or both
    • cat +dog --searches for cat +dog where dog is a mandatory term
    • cat -dog -- searches for cat excluding any result containing dog
    • [cats] —will restrict your search to results with topic named "cats"
    • [cats] [dogs] —will restrict your search to results with both topics, "cats", and "dogs"

Line Trace by Channel help please (blueprint)?

Here is my dilemma.
I have created a blueprint which at each game start, takes a defined number of meshes of a certain type and applies a random (within defined limits) Transform and Rotation to the object. In this case it is a rock. I intend to use this to apply to my Landscape to have a random scattering of rocks over the level. I will also use this for other objects, with the aim of creating a unique level every time you play (aside from the Landscape itself.

This would currently work as it is if the Landscape was flat, but of course it isn't so what I need is the ability for each mesh to do a Line Trace By Channel to check the Landscape's floor height and snap to that when spawning the individual meshes. I have created a custom Channel called Landscape and attempted to do some of the blueprint myself but I'm struggling with getting the hit location and using that to generate the Z value and turn that into the height information for the individual meshes.

If someone could show me a simple, complete usage of this it will hopefully give me enough clues to integrate something similar into my current blueprint. or if more info is needed I could share what I currently have in my Construction Blueprint for the meshes and you could tell me where I'm going wrong.

Thanks in advance, this'll help me TONS.

Daz

Product Version: Not Selected
Tags:
more ▼

asked Dec 05 '14 at 05:12 PM in Blueprint Scripting

avatar image

dazuk1978
42 13 17 22

(comments are locked)
10|2000 characters needed characters left
Viewable by all users

1 answer: sort voted first

Hey Daz,

If you create a custom Trace Channel called Landscape, with the default set to Ignore, and then adjust the collision on your landscape to block the Landscape Trace Channel, you can set up something like this in your Actor BPs:

alt text

What this does is get the Actor's location and the difference between that and a point straight down. I have the default for the variable TraceLength set at 0,0,1000, but you may need a longer trace depending on how high above the landscape you're spawning your Actor. The Trace Channel is set to Landscape, so it will only detect Actors with Landscape set to Block.

Then it takes the Out Hit and gets the location of that hit, and sets the Actor Location to that point. If you're rotating your Actor randomly, you may need to add a Z offset to this depending on the where the pivot point is in relation to the mesh.

Hope that helps!

movetolandscape.png (119.9 kB)
more ▼

answered Dec 05 '14 at 10:48 PM

avatar image dazuk1978 Dec 06 '14 at 12:40 AM

Hey Ben,

Well that helped me a hell of a lot and was very clearly explained. It ALMOST worked out of the box for me, but I think I am complicating it by already having a blueprint doing some other location and rotation stuff. Basically, it works for one of my Rocks, but the others are still floating too high.

here is what I have at the moment. I have tried hooking the Line trace in at various points in the bp, but I get similar behaviour every time. It may need me to edit the way I have done some of the other stuff in there before this works, but hopefully you can set me straight!? Sorry, bit of a newbie here to UE4. Your time is very much appreciated! alt text

P.S - Ignore the errors. It runs fine, I had just not compiled it at that point and moved some stuff around...

avatar image dazuk1978 Dec 06 '14 at 01:02 PM

If Ben is not around to follow up on this, can anyone else help please? I feel so close to doing it seeing as it works on one mesh but not the rest, or as in once config I tried, it worked on them all but they were all on top of each other!!!

Come on you geniuses, help out a thicko newb Daz

avatar image Ben Halliday STAFF Dec 06 '14 at 07:10 PM

It looks like you're only doing the Line Trace once, after the Loop completes. This means you'll only set the World Location for one component rather than all of them. You should probably run this after the Add Local Rotation node instead, essentially adding the component, setting a random location and rotation, then dropping it to the landscape below for EACH component made. Right now, you're only doing it for the last component saved in the ProcStore variable.

A couple things to consider:

  • You're setting a Transform for the mesh component. Transforms include a Location, Rotation, and Scale vector. If you wanted to, you could calculate the random Location and Rotation values and create a Transform, then feed that into the Add StaticMesh node. That way you don't need to add a Local Rotation after creating the component.

  • Your Line Trace is using the Actor Location for the Start value, but this is taking the World Location of the BP that contains all of this. Instead, if you're running this all from a single BP, you would want to use the location of the target component as the Start. Try using ProcStore > Get World Location instead.

  • You'll need to make sure that the location you're giving the mesh is above the landscape, or it won't drop and could end up colliding with the terrain. For rocks, this might be okay depending on what you're looking for, but you should be aware of the possibility. You can solve this by clamping the random vector you're using for location, if you want.

Happy to help! Let me know if you have more questions.

avatar image dazuk1978 Dec 06 '14 at 09:13 PM

Hey Ben, Thanks so much. This now has the desired effect of randomly spreading my meshes around the map!

2 Questions though, please: 1> When i set my ProcAmount to something like 500, which should take 500 meshes and spread them randomly, I've noticed that there is a nice spread but many of the meshes are on top of each other (with random rotations). I cannot be very precise and I don't think it's every instance of a mesh that has multiple meshes on it, but flying to a few at random there will be at least one of the locations that has multiple instances on top of each other. WHen I say they are on top of each other, I don't just mean they are overlapping, I mean they are at the exact same coords but with different rotations. 2> As a byproduct of the first question, how would I ensure during the spawn checks that two meshes do not overlap? I guess I need a secondary check using a sphere trace or something that checks for overlap and randomises the transform again if it hits another mesh? Could you give me a clue how I could incorporate such a check into the blueprint please?

Thanks again! Daz

avatar image Ben Halliday STAFF Dec 08 '14 at 11:05 PM

Yep, that's a result of random number generation. If you read up a bit on that, you'll discover that computers can't actually generate random numbers, but fake it in a number of ways that makes it harder to tell. With a large enough number of "random" vectors, you'll see a fair amount of overlap. They might not be at exactly the same location, but close enough that they might as well be.

As you suggested, doing a check to make sure it's not touching anything when it's spawned is how you could get around this. Since it sounds like you're going for something a little more complex, I would recommend checking out these resources:

  • This link is some of our documentation on random seeds. There's also a neat little one-shot tutorial that you might find interesting here that goes is similar to what you're looking to do.

  • In the Learn tab in the Launcher, there's a downloadable project called Blueprint Office. The most recent version is 4.5, but it converts to 4.6 with no problems. In it, you can find a pretty awesome blueprint called BP_Random_Foliage that spawns a bunch of plants from an array of static meshes that each align to the surface within a specified area. It's essentially an extended version of what you and I have been discussing, using Instanced Static Meshes. There's some documentation that helps explain how it works here.

Taking a look at that project and the BP_Random_Foliage blueprint inside it would probably help your project quite a bit if you're looking to randomly place a lot of different meshes in your levels.

Hope that helps!

avatar image rysmith25 Oct 03 '15 at 10:05 PM

Since I can't post my own question I'll post here, since it is somewhat similar. I need to get the hit results from a line trace and use that to set actor location and rotation. I have a mirror actor with a spot light and texture that I need to face in the same direction and start location as the reflected line trace. Any thoughts?

alt text

avatar image Ben Halliday STAFF Oct 05 '15 at 04:42 PM

Hi rysmith25,

It's not really clear what you're attempting to achieve. Can you be more clear about the desired result, what's actually happening, and your current setup?

Why can't you open a new post? This would be best addressed in another post in the Blueprint Scripting section. If you're able to now, I would recommend doing so with the information requested above. Thanks!

(comments are locked)
10|2000 characters needed characters left
Viewable by all users
Your answer
toggle preview:

Up to 5 attachments (including images) can be used with a maximum of 5.2 MB each and 5.2 MB total.

Follow this question

Once you sign in you will be able to subscribe for any updates here

Answers to this question