字幕列表 影片播放 列印英文字幕 [BELL DINGS] Hello, and welcome back to another video in chapter 2, the Nature of Code, about forces. So the last video, I looked at friction and modeling friction. And in this video I want to look at a drag force, which is quite similar to friction, but also different. Isn't that-- that's why I'm looking at it. But what I'm really doing here in these wrap-up videos to chapter 2 is doing some case studies. What are formulas that you might find in a textbook or Wikipedia that you just sort of feel like what do those mean, how do I even use that? Try to unpack those formulas and apply them in code. So the case study that this video will examine is drag-- drag force, something that's called air resistance. It's a kind of friction. And it's part of the field of study of fluid dynamics. And there's all sorts of interesting fluid simulation crazy stuff you could do, and there's lift and all sorts of-- there's like a lot you could get into. It's so crazy! But I'm going to boil things down and try to look at this particular formula for calculating a drag force. I brought that formula right here into the Nature of Code book, and this is what I'm going to use. So let's come over to the white board and replace the friction formula. This is the formula we want to implement, and the context we want to implement it in is a two-dimensional P5 canvas, where we have a body that's moving with a current velocity pointed down. Once again, we're calculating a force. So we need to both determine the direction of the force and the magnitude. Let's start with direction. Identical to friction is the direction of drag. We have the velocity unit vector and negative 1/2. So the drag force points in the opposite direction of velocity. So that's something we already know how to do. It's scaled with this negative 1/2 because, you know, science. But to us, in our P5 world, whether this is negative 1/2 or 5, it's going to be less important because this is made up units of measurement anyway. Then we have to start looking at other aspects of this. Let's go through these one at a time. So this Greek letter, RHO, stands for density. So what is this moving through? Well, if I were to take this marker and drop it, there would be air resistance. It's moving through a gas, the air. So what is the density of the air, versus if it landed in water, what's the density of the water, versus mud, or jello, or whatever kind of thing it's moving through. In our P5 world, assuming this circle, this body is moving through a kind of homogeneous uniform space, it's all the same stuff, the density of this air, or fluid, or whatever it is, is a constant. So RHO, the density, is a constant. Skipping v squared for a second, let's go to A. So A is surface area. So if I come back to the diagram in the Nature of Code book, we can see here the idea is what is the surface area of the object coming into contact with the fluid. And you can think of it like is it aerodynamic or not. Does it come like to a sharp point where there's very little surface area? Or is it kind of like a wide load, and there's a lot of surface area moving through this fluid? [GASP] While this is something I absolutely could try to model based on thinking about different shapes and different sizes of those shapes, I could also just consider that a constant, and maybe I'll just say all of the objects in my world come in with a surface area of 1. But I'm really just going to consider this to be a constant. So if I were to model it, it might make the ultimate simulation more dynamic and more realistic. But it's one thing that I think is a detail that I can mostly ignore, especially if I have a lot of circular bodies of relative similar size. Then we have the coefficient of drag itself. What's that? That's a constant. It's a constant. It's a constant that maps to the relative strength of the drag force itself. What I'm saying is, all of these three elements, with this negative 1/2, which is literally a constant, I can consider to be a constant in my simulation. So I can actually take this formula and simplify it greatly. Drag force is equal to negative 1 times some constant-- I'll call that the coefficient of drag. it's a constant that takes into account the negative 1/2, the surface area, the density, and the coefficient of drag-- times v squared, times the unit vector v. So once again, the direction is in the opposite direction of velocity. And it's scaled according to some constant times. And this one is really important. This is the speed squared. It's the magnitude of the velocity vector, and this is key. The faster the object is-- this was not the case with friction, not the case with kinetic friction. No matter how fast the object was moving, the friction force is not proportional to that speed. But in the case of drag. It's absolutely proportional. If I were to hold this marker absolutely still, it's not moving at all. There is no drag force on it. But if it's moving very, very fast, that drag force will be stronger. If it's moving slowly, it'll be weaker. And that's absolutely what I want to model. So I want the magnitude of this vector squared in our formula. I should also note that another way that you might see another notation for writing the magnitude of the vector is the name of the vector with two bars along each side. So you could also rewrite this formula like this. To demonstrate how to implement this, I'm taking an exact duplicate of the code I wrote in the previous video demonstrating friction. And all I've done here is I've renamed the Friction function, And I'm calling it Drag. What are elements-- is there anything here that I want to keep? Well, actually there is one thing that I want to keep, which is that I want to, when I'm getting the direction of the vector, I want negative 1 times the velocity unit vector. So this is what I want to keep. I want the direction now of the drag force. And I've got it here in this variable called drag. What's next? I need the magnitude of the drag force-- speed squared times the coefficient of drag. Well, let's make up a coefficient. Let's call it 0.1. The speed is this dot velocity dot mag. And then set the drag's magnitude to c times speed and apply the force. This is actually quite incorrect. Remember, it's not proportional to the speed. It's proportional to the speed squared, speed times speed. Guess what though? There's actually a function in P5 called Mag squared for magnitude squared. So it'll be a little bit more efficient if I just call this speed squared, and use the magnitude squared function. We can see that these objects that have less mass have a more difficult time accelerating. Let's see what happens if I take c and make it like a really high number, like 5. You can see all of these are really having trouble moving. They're just like slower. If I make it 500, can I get the force to be so strong that they don't move? Whoa. So one that I really have to watch out for, that force could become so strong it will actually push them back up in the opposite direction, which wouldn't actually happen. But again, with all of the various inaccuracies of things that I'm doing, I probably need to put some constraints on this. But with something like a coefficient of drag of like 0.1, in this contact with that, I'm getting realistic behavior. But I really want to emphasize this in a more meaningful way. So I think what I'm going to do is consider half of the canvas to have like a thick liquid that has a strong drag to it, drag coefficient, and the other half to be basically a vacuum with no drag. So let's go to the canvas and draw a rectangle and say fill to 55 and then alpha at 50 a rectangle. And we can make it even a little bit brighter. OK. So I want to draw on half of the canvas this rectangle that shows as if these objects are falling and land in water, or land in some liquid. So in this case, I'll just say if move or dot position dot y is greater than height divided by 2, move or dot drag. So we should now see them all fall at the exact same rate. But once they hit the water, the fluid resistance will affect them differently. Pause dot y. Let's make that drag force even a little bit stronger. Ooh, look at that. See, that's the issue. If it's too strong, you could see it's not very realistic. It's like bouncing off of it, which is kind of like a weird fun little like bug. It's a feature, not a bug. But obviously, it doesn't feel very realistic. Maybe it might make sense for me to have this drag coefficient be a global variable and actually perhaps even it's something that gets passed in to the function itself. Let's make it 0.2. So this wraps up this particular example to demonstrating a drag force. Here's some exercises of things you could try. One is I'm not being very thoughtful about how I'm considering the two dimensional space that is the canvas. I just kind of used height divided by 2 as this arbitrary marker between vacuum and liquid. Maybe I would actually want to create a liquid class, an object that describes a density, a coefficient, and an area of the canvas where that liquid or gas is present. And then I could build a map of having different liquids with different coefficients and different parts, and have a much more dynamic system of things experiencing different amounts of drag, depending on where they are. And maybe it's all color-coded. There's lots of possibilities there. Another thing that I might consider is thinking about surface area. Here I'm assuming that all of the objects have the same surface area, which isn't true. And I can visually see that they don't. And there's probably at least a very basic way that I can consider the size and have that be a factor in how I calculate the magnitude of a drag force. So that's definitely something I would suggest trying as well. So let me know if you have questions about this particular implementation. Try to make your own version of it. Think about just even the sort of visual design interaction of the system, but also what kinds of adjustments could you make to how the drag force behaves and what types of results might you get from that. And go to thecodingtrain.com where you can share your versions of this particular example. And I've got one more chapter 2 video to make, where I'm going to look at the formula for gravitational attraction, and look at orbiting bodies. See you there. [THEME MUSIC]
B1 中級 2.4 拖曳力--代碼的本質 (2.4 Drag Force - The Nature of Code) 3 0 林宜悉 發佈於 2021 年 01 月 14 日 更多分享 分享 收藏 回報 影片單字